パスワード ハッシュでソルトを使用する場合、パスワードごとに異なるソルトを使用し、暗号化せずにデータベースに保存することが推奨されるのはなぜですか?
それはとても無意味に思えます。攻撃者がデータベースにアクセスして、salt を見つけたら、salt がまったくないのと同じではないでしょうか?
ブルートフォースでパスワードをクラックしようとしていて、暗号化されたパスワードと同じ行に暗号化されていない単純なソルトがある場合、ソルトを試行するすべての単語/フレーズと連結することができますよね?
パスワード ハッシュでソルトを使用する場合、パスワードごとに異なるソルトを使用し、暗号化せずにデータベースに保存することが推奨されるのはなぜですか?
それはとても無意味に思えます。攻撃者がデータベースにアクセスして、salt を見つけたら、salt がまったくないのと同じではないでしょうか?
ブルートフォースでパスワードをクラックしようとしていて、暗号化されたパスワードと同じ行に暗号化されていない単純なソルトがある場合、ソルトを試行するすべての単語/フレーズと連結することができますよね?
ソルトのポイントは、誰かが一度にすべてのパスワードを攻撃するのを防ぐことです。各パスワードには異なるソルトがあるため、攻撃者はそれらを個別に攻撃する必要があります。これにより、各アカウントで試行できるパスワードの数が大幅に減少します。
そうしないと、攻撃者は考えられる 10 億個のパスワードをハッシュし、ハッシュされた各パスワードを自分のリストと比較することができます。
最初にhttp://en.wikipedia.org/wiki/Rainbow_tableを参照してください。
各パスワードにランダムなソルトを使用すると、ハッカーはレインボー テーブルを利用できなくなります。
元のパスワードのソルト付きハッシュと一致するかどうかを確認するために文字列をハッシュできるようにするには、ソルトを暗号化せずに保存する必要があります。
一部の crypt 関数は、暗号化されていないソルトを (特に) 暗号化されたソルト付きパスワードに連結します。たとえば、Der php bcrypt フグ。
ハッシュ化されたパスワードをブルートフォースするには、攻撃者は文字と記号のすべての可能な組み合わせをハッシュ化し、自分が持っているハッシュと比較する必要があります。
攻撃者がこのようなプレーンテキスト > ハッシュの組み合わせをブルートフォースした場合、攻撃者はすべての同一ハッシュのプレーンテキストを知っています。
ハッシュする前に平文にソルトが追加されるため、同じ平文が別のハッシュにハッシュされるため、攻撃者は個々のハッシュごとにすべての文字の組み合わせを試す必要があり、攻撃者の速度が大幅に低下します。
レインボーテーブルを作るには塩が必要で、そのようなものは役に立たない.
もちろん、ソルトは暗号化して保存できるため、単一のパスワードを解読するのは少し複雑になります.
しかし、それが通常どのように機能するかを見てください: ソルトをクライアントに送信し、クライアントはそれを使用してソルト + パスワードをハッシュします。したがって、クライアントは最初にソルトを復号化する必要があります。これは、多くの場合、攻撃者が実行できます。攻撃者がクライアントの動作を観察する機会がなかった場合、暗号化されたハッシュによってセキュリティが向上する可能性があります (あいまいさによるセキュリティ)。
公開ソルトを使用すると、パスワードのリストをクラックするのに時間がかかります。ただし、単一のパスワードをクラックする場合、辞書攻撃が難しくなるわけではありません。攻撃者は暗号化されたパスワードとソルトの両方にアクセスできるため、辞書攻撃を実行する場合、攻撃者は既知のソルトを使用してパスワードをクラックしようとするだけです。
誰かがあなたの DB を手に入れたら、さまざまな理由で大きなトラブルに巻き込まれます。理論的には、攻撃者が単一のソルトを取得 (または推測) する方がはるかに簡単です。彼らがあなたが使用する唯一のソルトを知っている場合、すべてのパスワードを同時にブルート フォースできます。ユーザーごとに異なるソルトを使用する場合、攻撃者は効果的に攻撃するために個々のソルトを知る必要があります。
ストレージ用のソルトの暗号化に関しては..それを行うことに問題はないと思いますが、攻撃者がDB全体をダンプできることはめったにないことを願っています. 可能であれば、認証を回避する必要がなくても、目的のものを取得できる可能性があります。