2

PHP のドキュメントによると、bcrypt ソルトは

「$2a$」、2 桁のコスト パラメータ、「$」、およびアルファベット 22 桁の「./0-9A-Za-z」

したがって、crypt() 関数を使用してパスワードをハッシュすると、結果の出力にはソルトの一部として最初の 7 文字 (コスト パラメーターが 10 の場合は $2a$10$) が含まれます。インターネット全体で見つけることができた場合、この完全な出力が db に書き込まれます。

これらの最初の文字を残りのソルトと暗号化されたデータと共に保存することに何の意味があるのか​​ 疑問に思っています。それらの意味は私には完全に明らかですが、なぜそのような情報が残りのハッシュと一緒に書かれなければならないのか本当に理解できません. それらは、アルゴリズムと計算の適応コストに関する「単なる」情報ではありませんか? では、このようなアプリケーション関連の情報を保存する利点は何でしょうか? そして (幼稚に聞こえるかもしれませんが) なぜ最終的に私のデータベースを盗む攻撃者にそれらを開示するのでしょうか?

4

1 に答える 1

11

その理由は、クリプトの仕組みにあります。次のことができるように設計されています。

if ($hashedPassword == crypt($rawPassword, $hashedPassword)) {
    //Verified
}

したがって、すべてを保存することで、毎回ソルト文字列を再作成する必要はありません...

そして、塩のポイントは秘密にしないことです. 実際、秘密にするつもりはありません。これは、レインボー テーブルを無効にするためのものです。彼らがあなたのデータベースを手に入れることができれば、他のものも手に入れることができる可能性が高いので、他の場所に塩を置いても実際にはあまり得られないことを覚えておいてください.

その上、塩はあまり役に立ちません。BCrypt は CPU-Hard になるように設計されています。つまり、ブルート フォーシング (ソルトを知っていても) は実用的ではありません。そのため、コストパラメータがあります。したがって、塩を「隠す」ことについて心配する必要はありません。パスワードと一緒に保存するだけで大​​丈夫です...

言うまでもなく、将来アルゴリズムを微調整したい場合はどうなりますか? たとえば、より優れたハードウェアがインストールされているため、コスト パラメーターを増やしたいとします。この情報をパスワードと一緒に保存しなかった場合、保存したパスワードはすべて無効になります。このようにして、保存された各パスワードには、それを検証するために必要なすべての情報が含まれています。そうすれば、ハッシュが現在のデフォルトである場合は有効なログインを確認でき、そうでない場合は、データベースを再ハッシュして新しいもので更新できます。ハッシュ方法の更新と改善に関連する問題を防ぎます...

于 2011-09-08T15:36:40.257 に答える