0

パスワードをデータベースに保存する必要があり、以前はソルトされたパスワードの sha1 ハッシュを、次のようにループされたランダムなソルトと一緒に保存していました。

$salt = sha1(microtime().mt_rand());
for ($i=0; $i < 4000; $i++) {
    $password = sha1($password.$salt);
}

(私の例で$password$salt、データベース内に保存されていました)。

hash_hmac()私は最近、単純な SHA1 ハッシュよりもはるかに安全な関数であることを発見しました。同じパターン (salt が秘密鍵) で使用する予定ですが、前の例のようにループする価値があるかどうか疑問に思っていました。誰かが私に洞察を与えることができれば、それは大歓迎です。

4

1 に答える 1

2

はい。

ここで行っていることはキー ストレッチングと呼ばれ、攻撃者が各候補パスワードをハッシュと照合するために必要な時間を倍増させます。あなたの例では、時間が 4000x 増加します。ここで防御している特定の脅威は、攻撃者がハッシュを取得し (LinkedIn、Last.fm、eHarmony で最近起こったことなど)、可能な限り多くの CPU パワーを割くことができる場合です。

これが研究プロジェクト以外の場合は、自分で作成するのではなく、 や などのよく知られた公的にテストされた関数を使用する必要がbcrypt()ありPBKDF2()ますscrypt()

そのループの数は 4000 よりもはるかに多くする必要があります。攻撃者は PHP ループではなく C ループを使用するため、適切な時間内に攻撃者ほど多くのことを行うことはできません。PHP ループでも、0.3 秒で 500,000 を実行できます。上記のハッシュ アルゴリズムは、C で実装されるため、この問題を解決します (すべてが PHP で利用できるわけではありませbcryptん) CRYPT_BLOWFISH使用方法の詳細は crypt() ページにあります


hash_hmac()より安全なハッシュ アルゴリズムではなく、別の目的で使用されます。ここでトーマスの答えの終わりを見てください。MD5およびファミリのようSHAなアルゴリズムは、特定の目的のためのより具体的なアルゴリズムの一部として通常使用される汎用ハッシュ アルゴリズムです。たとえば、上記のパスワード ハッシュ アルゴリズムの一部は、汎用ハッシュ アルゴリズムを何度も使用しています。 has_hmac()は、どの汎用ハッシュ アルゴリズムを使用するかを尋ねます。

于 2012-06-21T07:49:47.023 に答える