AES Crypt 参照実装を使用して、いくつかの小さなファイル(数百KB)を暗号化することを検討しています。ソースを見ると、暗号化キーはIVとパスワードから2つをバッファに連結してバッファに繰り返しハッシュすることにより導出されているようです。つまり、IVはハッシュの「塩」として機能しています。繰り返しますが、8192回という意味です。
これの利点は、キーを生成するのに必要な時間が増加することであり、ブルートフォース攻撃を実行してパスワードを発見することがより高価になることを理解しています。また、欠点は、実際のユーザーに対して正当な暗号化および復号化タスクを実行するのに時間がかかることです。さらに、ユーザーと攻撃者の両方が時間の経過とともにより高速なマシンを購入するため、メリットとデメリットはゼロになる傾向があります。
だから私の質問は、現在のコンピューター機能を考えて、専用クラスターを所有していないやる気のある攻撃者を想定すると、8192回の反復では不十分、やり過ぎ、または「ちょうどいい」でしょうか。また、このキー生成の分析で何か見落としていることがあります。そのような数の反復を選択する理由が他にあるため、それを適切な選択にしていますか?
パスワードベースの暗号化に関するRSAの標準では、「少なくとも1000回」の反復が推奨されているため、その要因は大まかな範囲にあるようです。
8192回の反復により、ブルートフォース攻撃を完了するのに必要な時間は、パスワードに13ビットのエントロピーまたは2文字の英数字を追加することに相当する係数(ブルートフォース攻撃のみに関して)に本質的に増加します。これは、計算能力の増加とは無関係であるため、これについて考える良い方法です。
問題は、あなたまたはあなたのユーザーが使用するパスワードのセキュリティを考えると、それを総当たりにすることは可能ですか? 13ビットを追加する場合、ブルートフォースを実行することは可能ですか?
ユーザーが強力なパスワードを使用している場合、その答えはおそらく両方ともノーです。ユーザーが辞書のWordを使用している場合、13ビットではそれを安全な領域にプッシュするにはおそらく不十分です。コンピュータがより強力になるにつれて、これらの質問に対するあなたの答えは時間とともに変化します。
パスワードが辞書の単語である場合、レインボーテーブルは迅速かつ効率的に生成できます。ソルトパスワードを使用すると、便利なRainbowテーブルを生成するためのサイズ/時間の要件が高くなります。 hash(salt + pass)を複数回繰り返すと、Rainbowテーブルの有用性が大幅に低下します。 Apacheのsalted MD5スキームはそれを1000回行うと思います。数値は完全に任意であり、ハッシュメカニズムを無効にするために問題に投入しなければならないハードウェアの量の基準を大幅に引き上げているだけです。より優れたハッシュメカニズムを使用すること(つまり、SHA-1を超えることを意味します NSAのSuite B にさえないことに注意してください)は、1つの方法です。何かをハッシュするのにかかる時間を選択できるアルゴリズムもあります。これは、ムーアの法則の結果として「暗号を破るスピードクリープ」に直接対処することになります。
暗号化パッケージを選択する場合は、AES CryptよりもGPGまたはPGPをお勧めします。 GPGとPGPは、暗号化コミュニティから多くの慎重な調査を受けています。私の知る限り、AES Cryptはそうではありません。したがって、私はAES CryptよりもGPGまたはPGPをより信頼します。
パスワードハッシュを繰り返す回数は、暗号化/復号化中に待機する時間とハッシュ関数の速度に基づいています。まず、待機する時間を決定します。たとえば、100ミリ秒です。次に、使用するコンピューターで反復ハッシュプロセスに100ミリ秒かかるような反復回数を選択します。できました。
@ PulpSpyが正確に説明したように 、ハッシュをN回繰り返すと、シークレットの有効エントロピーが約lg(N)ビット増加します。ここで、lgは2を底とする対数を表します。たとえば、8192 = 2 ^ 13の反復は、13ビットの有効エントロピーに対応します。これを有効なパスフレーズの長さに変換するのは簡単ではありません。 (@PulpSpyが書いたものとは異なり、すべてのパスフレーズのすべての文字が同じ量のエントロピーを持っているわけではないため、13ビットのエントロピーは直接2文字に変換されません。@ nealmcbが正しく説明するように、パスフレーズの文字ごとのエントロピーは異なりますが、は通常、1文字あたり1〜2ビットの範囲であるため、これは、パスフレーズの長さが8文字の大体の近くのどこかで増加していることに対応している可能性があります。
最後に、パスフレーズから暗号化キーを選択することは、一般的に危険な方法と見なされることを警告します。人間が選択したパスフレーズは、暗号化に対するブルートフォース攻撃から保護するのに十分なエントロピーを提供しないことがよくあります。したがって、高度なセキュリティ対策のために人間が選択したパスフレーズはお勧めしません(または、人間が選択したパスフレーズを使用する必要がある場合は、ソフトウェアを使用して、エントロピーの高いパスフレーズを選択してください)。最高の暗号化ソフトウェアは、人間が選択したパスフレーズではなく、可能な限り暗号鍵に真のランダム性を使用する傾向があります。
反復回数は、使用可能なパワーに応じて調整する必要があります。これにより、処理時間は、限られたユーザーの忍耐という厳しい制約の下でも適合します。あなたはまだ数をできるだけ高くしたいです。
数学を使用する場合:パスワードの処理に時間がかかる[〜#〜] t [〜#〜]システムで(たとえば1秒)、攻撃者は費やす準備ができている場合T 'パスワードをクラックして(3週間など)、まとめてであるマシンにアクセスできます(〜/〜/ =)[〜#〜] p [〜#〜]倍の強さの場合、攻撃者はあなたより係数T '* P/Tの利点があります。これに対する防御はパスワードエントロピーです。パスワードにエントロピーeビットがある場合、攻撃者は(平均して)Tの場合にのみ(= /// =)Tの場合にのみ敗北します'* P/T <2e-1。 [〜#〜] t [〜#〜]= 1秒、T '= 3週間、P = 100(攻撃者がGPUを備えた5台のPCを持ち、予算が3000 $未満の場合)、パスワードには少なくとも27.4ビットのエントロピーが必要です。おそらく、セキュリティマージンを少し確保して、30ビットにしたいと思うでしょう。あなたはできます、十分な情報を得た個人として、それよりも強力なパスワードを選択します(この件については少し議論があります この質問 ) ;しかし、ほとんどのユーザーがそうすることを期待することはかなり楽観的です。
上記の方程式では、反復数を使用して[〜#〜] t [〜#〜]を変更しています。適切な数は、最終的には利用可能な能力と平均的なユーザーの忍耐力に依存しますが、8192回の反復が少なすぎる可能性があります。パスワード変換プロセスの説明に基づいて(繰り返しハッシュ-これは PBKDF2 の縮小バージョンのように見えます)、一般的なPCでの反復回数はでカウントする必要があります数百万。
そういえば、カスタムのパスワード処理手法は強力な赤い警告であるべきです。これは良くありません。 PBKDF2や bcrypt などの実証済みの標準化されたアルゴリズムに依存することをお勧めします(後者は「処理力率」を下げるため、推奨されます[〜#〜] p GPUを使用する攻撃者の[〜#〜]-詳細は この答え を参照)。
「必須」ではありませんが、パスワードの解読が難しくなります。これは「キー強化」と呼ばれ、論理的にはパスワードの末尾に2文字(大文字/小文字の記号)を追加するようなものです。それはかなり一般的です。たとえば、アクセスポイントを保護するWPAは、パスワードを4000回ハッシュします。