高価なハッシュで資格情報を保護する必要性と、暗号的にランダムなソルトを使用する必要性を理解してください。
私が理解したいのは、ソルトをハッシュと一緒にデータベースに保存する理由です。これは、ソルトを持っていることのポイントを無効にしませんか?
UserテーブルのデータをダンプできるSQLインジェクションの脆弱性を取り上げてください。塩だけでなくハッシュにもアクセスできる場合、ブルートフォースの試みは簡単にはなりません(塩を知らない場合と同様)。
ハッシュと一緒にソルトを保存する場合-これはRainbow攻撃に対する保護のポイントを無効にしませんか? (攻撃者がデータベースにアクセスできる場合)。
あなたがどこから来たのかはわかりますが、答えは基本的に「それは塩の目的ではありません」です。 特定のユーザーのパスワードを見つけようとしている場合、ハッシュのすぐ横にあるソルトはあまり役に立ちません。ただし、その状況で役立つことは期待されるではありません-個々のユーザーのパスワードを解読することはすでに十分に困難です。
ソルトのポイントは、各パスワードが一意になるようにハッシュする前に各パスワードに追加することです。2人のユーザーが両方ともパスワードとしてhunter2
を持っている場合、ハッシュは異なる必要があります。
攻撃者がデータベース(またはデータベース全体)をフィッシングして、パスワードがletmein123
である全員を見つけたとします。ソルトがなければ、ハッシュを1回実行してハッシュを検索できます。
ソルトなしでは、攻撃者がデータベースで2つ以上の同一のハッシュを見つけた場合、これは弱いパスワードであることを示し(複数のユーザーが同じパスワードを選択しているため)、これを最初に解読することに集中できます。
しかし、ソルトはハッシュする前にパスワードに追加されるユーザー固有のプレフィックス/サフィックスなので、(「パブリック」ソルトを使用しても)攻撃者はすべてのユーザーのハッシュを再計算する必要があるため、1つのパスワードを10000ユーザーに対してチェックしますこれは、1人のユーザーに対して10000のパスワードをチェックすることよりも効率的ではありません。