PHP で sha1 を使用してパスワードを暗号化していますが、パスワードをハッシュするだけでなく、ハッシュをハッシュする方が安全かどうか疑問に思っています。
例えば:
は
$hash = sha1($pwd);
よりも安全性が低い
$hash = sha1(sha1($pwd));
逆引きサイトはハッシュのハッシュの一致を見つけることができないため、なぜそうならないのかわかりません。
PHP で sha1 を使用してパスワードを暗号化していますが、パスワードをハッシュするだけでなく、ハッシュをハッシュする方が安全かどうか疑問に思っています。
例えば:
は
$hash = sha1($pwd);
よりも安全性が低い
$hash = sha1(sha1($pwd));
逆引きサイトはハッシュのハッシュの一致を見つけることができないため、なぜそうならないのかわかりません。
パスワード ストレージを安全にするには、sha1
またはその他の高速ハッシュ アルゴリズムを使用しないでください。代わりに、BCryptなどのキー派生関数を使用してください。
高速アルゴリズムの問題は、一般的なハードウェアで毎秒 3 ギガの sha1 ハッシュを計算できることです ( 2012 年)。これにより、約 500,000 語の英語辞書全体を 1 ミリ秒未満でブルート フォースすることが可能になります。
あなたの例の2番目の問題は、塩の欠落です。すべてのパスワードに一意のソルトを使用しない場合、攻撃者は単一のレインボー テーブルを構築してすべてのパスワードを取得できます。
BCrypt は特にパスワードをハッシュするように設計されているため、処理が遅くなります(計算時間が必要です)。コスト ファクターを使用すると、必要な時間を将来の (したがってより高速な) ハードウェアに適応させることができます。内部的には、あなたが提案したのと同様のことを行います。ハッシュを何度も繰り返しますが、安全な方法で行います。
BCrypt の使用は、sha1 ハッシュを使用するのと同じくらい簡単です。PHP 5.5 には独自の機能がpassword_hash()
ありpassword_verify()
、このタスクを簡素化する準備ができています。PHP 5.3/5.4 用の互換パックも利用可能で、 password_compatからダウンロードできます。
ダブルハッシュはあまり役に立ちません。塩漬けはします。
まず第一に、sha1 だけの脆弱性は、平文で保存されたパスワードよりも優れています。暗号化、ハッシュ、またはその他の難読化は、平文よりもはるかに優れています。
sha1 の問題は、高速であるため、クラックするハッシュの生成が高速であることです。ソルティングは大いに役立ちますが、サーバーが侵害され、ソルト ハッシュが文字列としてどこかに保存されている場合、その利点があります...
mcrypt や別の暗号化方式を使用したくない場合は、次のように sha1 ハッシュを少し混同できます。
$my_super_sha1_hash =
sha1(
sha1(
substr(
sha1($username)
, 0
, strlen($password)
)
)
.sha1(
substr(
sha1($password)
, 0
, 40-strlen($password)
)
)
);
ユーザー名とパスワードを混ぜ合わせ、(不明な) パスワードの長さを使用して、文字列で使用されている各ビットを決定し、再度ハッシュすることにより、各ソルトは一意ですがランダムではないため、すべてのソルトで一貫した結果が得られます。パスワードとユーザー名の文字列の長さを考慮に入れる必要があるため、クラックするのは非常に困難です。