パスワードソルトはランダムである必要はなく、秘密でさえある必要はありません。重要なのは、各パスワードのソルトが一意であることです。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 年。