3

私はBcryptのソルトを生成する必要があり、ソルトがBcryptを無意味にするほど弱くならないようにするために、PRNGがどれほどランダムである必要があるかを理解しようとしています。ランダム性の原因には、次の5つの一般的なクラスがあります。

  1. デフォルトのシードがシードされたPerl5に付属するPRNG(これは、秒の現在の端数、現在の秒の端数を保持しているもののアドレス、プロセスのpid、およびPerlスタックのアドレスのようです。ポインタはすべていくつかの素数と混合されています)
  2. 他のシードがシードされたPerl5に付属するPRNG
  3. 他のPerl5ベースのPRNGのようなMath::Random::Secure
  4. からバイトを読み取るだけ/dev/urandom
  5. からバイトを読み取るだけ/dev/random

私の意見では、このコードが実行されるマシンはすでに非常に大きな打撃を受けてい/dev/randomます(マシンがビジーの場合、/proc/sys/kernel/random/entropy_avail500未満に低下します)。そうでない場合、これは問題ではなく、単にを使用します/dev/random。そうは言っても、それが十分に重要であれば、/dev/random/とにかく使用します(人々はそれほど頻繁に新しいパスワードを設定しません)。

4

4 に答える 4

6

ソルトは、同じ入力に対して複数回実行されたときにハッシュ関数の出力を異なるものにし、レインボー テーブル攻撃を防ぐためにのみ使用されます。暗号強度は、関数自体の実装によって提供されます。適切に分散された RNG は、salt に対して適切に機能します。真のエントロピーは必要ありません。

于 2012-06-18T12:45:37.350 に答える
3

パスワードソルトはランダムである必要はなく、秘密でさえある必要はありません。重要なのは、各パスワードのソルトが一意であることです。Schneier's Applied Cryptographyの第 2 版の 52 ページと 53 ページからの以下の抜粋を参照してください。

ビットをランダムに選択することは、わずかな衝突確率で一意のソルトを生成する実装です。このようなソルトジェネレーターは、システムで現在使用されているソルト値のリストを読み取るために昇格された特権を必要としないため、これは一般的にまともな取引と見なされます。

ではbcrypt、salt は後で認証を試行するためにプレーンテキストで保存されます。これは、システムのハッシュ化されたパスワードのリスト全体が危険にさらされる可能性があることを意味します. その時点で、ランダム ソルトは役に立ちません。以下の抜粋の最後の段落のオチに注意してください。ソルトは辞書攻撃を混乱させますが、ある程度までです。

保守的なアプローチは、暗号的に安全な RNG を使用してソルト値を選択することです。 .

辞書攻撃とソルト

一方向関数で暗号化されたパスワードのファイルは、依然として脆弱です。マロリーは余暇に、最も一般的な 1,000,000 個のパスワードのリストを編集しています。彼は 1,000,000 個すべてを一方向関数で操作し、結果を保存します。各パスワードが約 8 バイトの場合、結果のファイルは 8 メガバイト以下になります。数枚のフロッピー ディスクに収まります。ここで、マロリーは暗号化されたパスワード ファイルを盗みます。彼はそのファイルを暗号化された可能なパスワードのファイルと比較し、何が一致するかを確認します。

これは辞書攻撃であり、驚くほど成功しています (セクション 8.1 [「鍵の生成」] を参照)。はそれをより困難にする方法です。Salt は、一方向関数によって操作される前にパスワードと連結されるランダムな文字列です。次に、ソルト値と一方向関数の結果の両方が、ホスト上のデータベースに格納されます。可能なソルト値の数が十分に多い場合、マロリーは可能なソルト値ごとに一方向ハッシュを生成する必要があるため、一般的に使用されるパスワードに対する辞書攻撃を実質的に排除します。これは、初期化ベクトルでの単純な試みです (セクション 9.3 [「暗号ブロック連鎖モード」] を参照)。

ここでのポイントは、マロリーが他の人のパスワードを解読しようとするたびに、可能性のあるすべてのパスワードに対して大規模な事前計算を行うのではなく、辞書内の各パスワードの試験的な暗号化を行う必要があることを確認することです。

塩分は多めに必要です。ほとんどの UNIX システムは、12 ビットのソルトのみを使用します。それでも、Daniel Klein はパスワード推測プログラムを開発しました。このプログラムは、特定のホスト システムのパスワードの 40% を 1 週間以内にクラックすることがよくあります [847,848] (セクション 8.1 を参照)。David Feldmeier と Philip Karn は、4096 の可能なソルト値のそれぞれと連結された約 732,000 の一般的なパスワードのリストをまとめました。彼らは、任意のホストのパスワードの 30% がこのリストで破られる可能性があると推定しています [561]。

塩は万能薬ではありません。ソルト ビットの数を増やしてもすべてが解決するわけではありません。Salt は、パスワード ファイルに対する一般的な辞書攻撃に対してのみ保護し、単一のパスワードに対する共同攻撃に対しては保護しません。複数のマシンで同じパスワードを使用している人々を保護しますが、不適切なパスワードの選択を改善するわけではありません。

561. DC Feldmeier および PR Karn 共著、「UNIX パスワード セキュリティ - 10 年後」、暗号学の進歩 - CRYPTO '89 議事録、Springer-Verlag、1990 年、44 ~ 63 ページ。
847. DV Klein、「'Foiling the Cracker': A Survey, and Implications to, Password Security」、USENIX UNIX セキュリティ ワークショップの議事録、 1990 年 8 月、5 ~ 14 ページ。
848. DV クライン、私信、1994 年。

于 2012-06-18T14:02:41.470 に答える
1

Math::Random::Secure通常はから読み取るため、使用することをお勧めし/dev/urandomます。

弱いランダムシードを使用することもできますが、そうすることで、bcryptには、ソルトが「簡単に」予測できる場合にのみ現れる弱点がないという少しのギャンブルをしていることになります。たぶん、あなたは大丈夫ですが、暗号のベストプラクティスからも逸脱しています。

パスワードについては、デフォルトで「正しい方法で行う」ことになります。

于 2012-06-18T12:46:33.570 に答える
1

私は最終的にBcrypt を説明する元の記事に行き、この引用を見つけました:

bcrypt 実装の重要な要件は、128 ビットのソルト スペースを完全に活用することです。OpenBSD は、arcfour (arc4random(3)) キー ストリームから 128 ビットの bcrypt ソルトを生成し、カーネルがデバイス タイミングから収集したランダム データをシードします。

これに基づいて/dev/random、高品質の PRNG を初期化してシードを生成します。

高品質の PRNG を使用する理由については、この記事にも記載れています。

于 2012-06-19T12:54:10.927 に答える