一般に、複数のハッシュアルゴリズムを使用する必要はありません。
あなたがする必要があるのは:
saltを使用する:saltはパスワードをより安全にするためだけに使用されるのではなく、レインボーテーブル攻撃を回避するために使用されます。そうすれば、システムに保存するパスワードのハッシュを事前に計算しようとして、誰かがより苦労することになります。
複数の相互作用を使用します:SHA(password + salt)だけを行う代わりに、SHA(SHA(SHA(SHA(SHA(... SHA(password + salt))))))を実行します。または、他の方法で表すには:
hash = sha(password + salt)
for i=1 , i=5000, i++ {
hash = sha(hash + salt);
}
そして最後に、適切なハッシュ関数を選択します。SHA、MD5などは、速すぎるため良くありません。保護にハッシュを使用するため、低速のハッシュを使用することをお勧めします。たとえば、Bcrypt、PBKDF2またはScryptを見てください。
編集:観察した後、いくつかのポイントを見てみましょう(申し訳ありませんが、最後に到達するための長い説明。
保存されたパスワードに誰もアクセスできないように、システムが安全であれば、ハッシュは必要ありません。パスワードは秘密であり、だれもそれを取得しません。
ただし、パスワードを含むデータベースが盗まれることを保証することはできません。データベースを盗み、すべてのパスワードを取得しました。わかりました、あなたのシステムとあなたの会社はそれのすべての結果に苦しむでしょう。そのため、このパスワードの漏洩を回避することができます。
この時点でオンライン攻撃を心配していないことに注意してください。あるオンライン攻撃の場合、最良の解決策は、不正なパスワードの後に速度を落とす、いくつかの試行後にアカウントをロックするなどです。そのため、パスワードを暗号化、ハッシュ、保存などの方法は関係ありません。オンライン攻撃とは、パスワード入力を遅くすることです。
それでは、don't let them take my plain passwords
問題に戻りましょう。答えは簡単です。プレーンテキストとして保存しないでください。はい、わかった。
それを避ける方法は?
パスワードを暗号化します(?)。ただし、ご存知のように、適切なキーがあれば、暗号化すれば復号化できます。そして、あなたはキーを「隠す場所」の問題になってしまいます。彼らはあなたにデータベースを手に入れたので、彼らはあなたの鍵を手に入れることができます。使用しないでください。
そのため、別のアプローチ:パスワードを元に戻せない別のパスワードに変換して保存します。そして、指定されたパスワードが正しいかどうかを確認するために、同じプロセスを再度実行し、変換された2つの値が一致するかどうかを確認します。一致する場合=適切なパスワードが提供されました。
さて、これまでのところとても良い。パスワードにMD5ハッシュを使用してみましょう。しかし...誰かがパスワードのハッシュ値を保存している場合、すべての可能なパスワード(ブルートフォース)のMD5ハッシュを計算するためのコンピューターの能力を十分に持つことができるため、元のパスワードを見つけることができます。または、最悪の場合でも、彼はすべてのキャラクターの組み合わせからすべてのMD5を保存し、パスワードを簡単に見つけることができます。そのため、HASH(HASH(HASH()))のように多くのイテレーションを実行し、より時間がかかるため、難しくします。
しかし、それは回避できますが、レインボーテーブルは、この種の保護に対抗するために正確に作成されました。
それで、その上にいくつかの塩を使用しましょう。この方法では、各相互作用で、塩が再び使用されます。パスワードを攻撃しようとすると、ソルトが毎回追加されることを考慮して、レインボーテーブルを生成する必要があります。そして、彼がそのレインボーテーブルを生成するとき、1つのソルトで生成されたため、彼はもう1つのソルトで再度計算する必要があるので、各パスワード(=各ソルト)にいくらかの時間を費やす必要があります。Saltはパスワードに「複雑さ」を追加しません。それは、攻撃者がレインボーテーブルを生成する時間をゆるめるだけです。パスワードごとに1つのsaltを使用すると、1つのsaltのテーブルは別のパスワードには役に立たなくなります。
そして、ここで複数のハッシュを使用すると役立ちますか?いいえ。特定のレインボー攻撃を生成する人は、とにかく1つ以上のハッシュを使用して生成できます。
また、複数のハッシュを使用すると、1つの問題が発生する可能性があります。使用する最も弱いハッシュと同じくらい安全です。誰かが1つのハッシュアルゴリズムで衝突を見つけた場合、そのハッシュが反復プロセスの任意の時点で悪用されてパスワードが破られます。したがって、より多くのハッシュアルゴリズムを使用しても何も得られません。良いアルゴリズムを1つだけ選択することをお勧めします。そしてそれを使用します。そして、それが壊れていると聞いた場合、アプリケーションでそれをどのように変更するかを考えてください。
そして、なぜbcryptまたはそのようなものを使用するのか(あなたはそれを使用すると言います):攻撃者はテーブルの生成により多くの時間を費やす必要があるからです。そのため、MD5 +待機(3秒)を使用しても役に立たないのです。攻撃はとにかくオフラインになるため、攻撃者は(3秒の遅延なしで)テーブルを生成できます。