1

問題

私はpythonでアプリケーションを書いています。個人に関する連絡先やその他の情報を処理します。ユーザーが主要な操作を実行するたびに、マスター キーの入力を求めたいと考えています。私はすべてを理解しました。アプリケーション全体の準備が整い、うまく機能します。ただし、マスターキーはファイルに保存します。このファイルは、プレーン テキスト形式で簡単に読み取ることができます。これを使ってみた私の友人は、強力な暗号化アルゴリズムを適用しないとソフトウェアは役に立たないと言っていました。

ゴール

自分のプログラムだけが解読 (または読み取り) できる形式でマスター キーを格納するため。

他のもの

  1. ユーザーがマスター キーを変更するオプションがあります。
  2. マスター キーは一度だけ読み取られ、解読されます。プログラムの開始時。その後、変数に格納され、この変数から使用されます。
  3. GUIアプリケーションです。そして、私はpython Tkinterを使用しています。

詳細

データは、破ることはできませんが、この種の情報には十分な別の暗号化を使用して保存されることに注意してください。

情報を保存するためにデータベースを使用していません。

暗号化される唯一のデータは、マスター キーです。これは、7 ~ 80 文字の長さの英数字の文字列です。

スペック

1.パイソン2.7
2.Tkinter 8.5
3. Linux ミント 14
4

5 に答える 5

2

パスワードの複雑な暗号化は必要ありませんし、必要でもありません。説明しているのは、キーではなくパスワードです (アクセスを許可するだけで、データを暗号化するわけではありません)。現在のベスト プラクティスは、パスワードをソルト化およびハッシュ化して保存することです。つまり、ユーザーが新しいアカウントを作成してパスワードを入力すると、パスワード、ユーザー名、および「salt」から文字列が作成されます (これは、サイトの全員に同じ小さな文字列です。これはレインボー テーブル攻撃を阻止します)。次に、その文字列を適切なハッシュ アルゴリズムに通します。SHA1 などで問題ありません (反対の報告があるにもかかわらず、MD5 で十分です)。確かに、AES のようなものは必要ありません。とにかく、ハッシュを取得したので、パスワードではなくハッシュをデータベースに保存します。AES のような強力な暗号でも、そうしないと役に立ちません。

次にユーザーがログインするときも、同じことを行います。パスワードをユーザー名とソルトに追加し、それをハッシュして、ハッシュを保存されているものと比較します。原則として、自分のパスワードが何であったかを知る方法はありません。そのため、攻撃者がデータベースを取得し、アルゴリズムとソルトを知っていたとしても、それを見つける方法はありません。

于 2013-04-22T11:58:12.560 に答える
1

コメントの質問で示唆されているように。これは、現在構築しているパターンとは少し異なるパターンです。

まず第一に、何かを暗号化する場合は、よく知られている一般に知られているツールを使用して暗号化してください。最近のクラシックは AES です。これは生の暗号であり、16 バイトのブロックで暗号化を実行します。必要なのは、128、192、または 256 ビット長の秘密鍵だけです。
実際には、基礎となる暗号はそれよりも多くの長さをサポートしていますが、アルゴリズムはこれら 3 つの長さで十分にテストされているため、それらに固執する可能性があります。

ここで、特定のケースで暗号をどのように使用できるかを決定する必要があります。暗号化モードの選択は非常に重要です。暗号化モードは、特定の暗号を使用する特定の方法です。最も基本的なのはECB (電子コードブック) です。これは、特定のキーを使用してブロックごとに暗号ブロックを適用するだけで構成されます。疫病のように避けるべきです!

暗号化モードを使用しても、まだ完了していません。次に、キー スケジュールと呼ばれるものを見つける必要があります。つまり、パスワードやパスフレーズなどの一意のキーが与えられた場合、基礎となる暗号システム (ブロック暗号 + 暗号化モード) に提供するために必要な暗号化キーを導出する必要があります。

AES-128 (128 ビット キーで使用される AES) に基づく単純なパターンから始めます。

主なスケジュール

パスフレーズからキーを導出する良い方法は、ハッシュ関数を使用することです。実用的なキーを取得するには、パスフレーズと (オプションの) 追加データをハッシュするだけです。HMACの構築に基づいて、私が提案するものは次のとおりです。

入力 : 7 ~ 80 文字のパスワードK 、ターゲット ユーザーを指定する文字列s (疑似など)、およびハッシュ関数H

出力 :暗号鍵K s

次のプロセスを使用してK sを導出します。

K s = HMAC-H ( s , K )

Hのダイジェストの長さによっては、切り捨てて 128 ビットにしなければならない場合があります。(よく知られているハッシュ関数は通常、128 ビットを超える出力を持ちます)。たとえば、 H = SHA-1 またはH = MD5 を使用できます。

暗号システム

保存するデータの期間はわかりませんが、大きすぎないと思います。CBC (Cipher Block Chaining) モードをお勧めします。このモードでは、有名な 128 ビット キーと、初期化ベクトル(略してIV ) と呼ばれる追加の 128 ビット ベクトルが必要です。同じ (キー、IV) ペアを 2 回使用しないでください。(ルール[1])

ここで、次のことを前提として、次のことができます。

  • ユーザーごとに 1 つのデータ ファイルがあります
  • IO 操作で少しのオーバーヘッドを受け入れる

データは 512 バイト単位 (つまり、16 バイトの 32 ブロック) で暗号化します。IVパターンは単純です。16 バイトで 0 をエンコードすることから始め、新しい 512 バイト ブロックが追加されるたびに増分します。

簡単な例:

ユーザー Cthulhu は、友人と連絡を取り合い、邪悪な陰謀を共有したいと考えています。彼のパスフレーズは運命です。

  • 彼のデータ ファイルはK Cthulhuを使用して暗号化されます。K = doomを使用すると、 K Cthulhu = HMAC-H (Cthulhu, doom) となります。
  • ファイルは 512 バイトのチャンクに分割されます。データ チャンク番号iIVは、 16 バイトのiの一般的な整数バイナリ表現です。

クトゥルフには多くの邪悪な友人がいる可能性があることは知っていますが、16バイトの整数がオーバーフローしないと合理的に推測できるため、ルール[1]が適用されます。

ここでは、それほど悪くはないが改善できる基本的な暗号システムが必要です。

  • MAC (メッセージ認証コード) スキームによる認証済み暗号化の使用。CCMなど、一部の実行モードにはこれが含まれることに注意してください。
  • キー スケジュールの強化: 選択したハッシュ関数に対してレインボー テーブル攻撃が発生する可能性があります。攻撃者にとって事態を複雑にするために、プロセスにランダム ソルトを導入します。
  • パターン「ユーザーごとのファイル」を変更すると、「ねえ、ここで見つかるのは同じユーザーに関連している」などの情報が漏れるからです。

1 つ目は非常に簡単に導入できます ( CBCの代わりにCCMを使用するだけで、ほぼ完了です)。ただし、最後の点は解決がはるかに困難です。あなたがしなければならないことは、ファイルシステムで行われることと似ています。

于 2013-04-22T11:43:20.617 に答える
1

自分自身を暗号化および復号化するために、対応するコードを作成する必要がありますか? または別の方法がありますか?

前述のように、hashlib は標準の python モジュールであり、システムには何らかの暗号化プログラムも付属している必要があります。私のシステムでは openssl と呼ばれ、さまざまな暗号化アルゴリズムを指定できます。

#python 3
import subprocess as sp

master_key = b'hello world'
my_subprocess = sp.Popen(['openssl', 'sha1'], stdin=sp.PIPE, stdout=sp.PIPE);


my_subprocess.stdin.write(master_key)
my_subprocess.stdin.close()
print(my_subprocess.stdout.read().rstrip())
于 2013-04-23T04:57:12.547 に答える
1

機密データをパスワードで保護したい場合は、AESなどの「市販の」対称暗号化アルゴリズムを使用することをお勧めします。このようにして、データは強力に暗号化され (いくつかのパラメーターが適切であると仮定します)、ディスク上のどこかにパスワードを保存する必要さえありません。

PyCryptoは、暗号化に広く使用されているツールキットであり、AES も提供します。特に、「PyCrypto を使用して AES を実行する方法」に関するすべての例を見つけることができるため、開始するために必要な詳細を理解するのは少し面倒な場合があります。すべてが少し異なっていました (たとえば、アルゴリズムの初期化、パディング)。

手始めに、このブログ投稿では、いくつかの説明とコード スニペットを提供します。(注: そこに示されているコードは、復号化された (=実際の) データをファイルに書き込みます。これは重大なリスクになる可能性があります。コードの仕組みを理解したら、復号化されたデータを文字列として保存するためにコードを変更し、既に持っているアプリケーション コードを使用して内容を読み取ります。)

于 2013-04-22T10:09:09.593 に答える
1
  1. ユーザーがマスター キーを選択し、それを暗号化してファイルに保存します。
  2. ユーザーが主要な操作を行う場合、マスター キーの入力を求めるプロンプトが表示され、入力内容が暗号化されます。
  3. #2 と #1 を比較し、それらが一致する場合は、ユーザーを先に進めます。それ以外の場合は、ユーザーに道に迷うように伝えます。

マスターキーを解読可能な形式で保存するには

いいえ。解読できれば、ハッカーも解読できます。100年間ノンストップで動いているスーパーコンピュータでは解読不可能なものが欲しい。データの機密性によっては、SHA-1/SHA-2/SHA-3 だけで十分な場合があります。ここを参照してください:ウィキペディア

誰かが暗号化を含むファイルのコピーを盗み、アプリがマスター キーの入力を求めたときに暗号化の 1 つを入力した場合、アプリは暗号化を暗号化し、結果は .xml のどの暗号化とも一致しません。ファイル。

于 2013-04-22T08:08:12.047 に答える