私は、PHPアプリケーションでパスワードを保護するためのより良い手順を調査してきました。正式には、私は次のようなものを使用していました(単なる例です。撃たないでください!):
$salt = md5(rand() . md5(rand() . '$%E$%SDRT');
$password = md5('supersecret', $salt);
次に、レインボーテーブルの使用を防ぐために、データベース内のパスワードごとに異なるソルトを生成します。
ほとんどの(賢い)人々はbcrypt()に向かっているようですが、オンラインで見てください。それがどのように機能するのか、なぜそれが機能するのかなどについてはたくさんの質問がありますが、私が理解していないのは、それがどのように安全であるかということです。私はここで私の理解に混乱しているかもしれないことに注意してください
crypt($ pass、$ salt)を使用すると、saltは実際にcryptのインジケーターとして機能し、使用するアルゴリズムを指示することを理解しています。PHPのマニュアルによると、log2ラウンドでblowfishを使用するようにcryptに指示する「$ 2a$07」を使用します。次に、接頭辞としてソルトを含む文字列を吐き出します。
マニュアルの例:
Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
また、すべてのパスワードに対してソルトは静的なままであるようです。これがどのように安全かわかりません。ハッカーがソルトを見つけるのはさらに簡単なようで(ソルトカラムから引っ張る必要さえありません)、開始時に使用されたラウンドとアルゴリズムを示すビーコンがあります。これをより安全にするにはどうすればよいですか?ラウンド数が増えるとハードウェアの負担が大きくなり、スケーラブルになり、パスワードの解読にかかる時間が長くなります(コストがかかるため)が、それがどのように行われたかを正確に示しています。
また、私は、動作をより深く理解するために、できるだけ多くのアプリケーションを自分でコーディングするのが好きで、可能であればオープンウォールから離れることを望んでいます。私は他の人々のコードに依存し、次に彼らの脆弱性を吸収するのは好きではありません。私はむしろ自分自身の脆弱性に責任を持ち、自分でそれらを修正したいと思います。
もう一つ。ラウンド数を増やしても、現在のパスワードハッシュがデータベース内のハッシュのハッシュと一致しないという意味ではありませんか?すべてのユーザーのパスワードをリセットする必要がありますか、それとも次のログイン時に新しいラウンド数に向かってゆっくりとパスワードを移動しますか?
私が言うように、これは単に私の理解であるため、混乱しているのは私の理解かもしれません。これは、単に「試して失敗する」ことができる例の1つではないと思います。失敗すると、壊れたアプリケーション以上のものを見る可能性があるからです...
私が読んでいるもの:
PHPのクリプトを使用したフグの塩の正しい形式は何ですか?
PHPマニュアル
-CryptOpenwallphpass
PHPでBlowfishを使用してパスワードハッシュを作成および保存する方法PHPでパスワード
をハッシュするためにbcryptをどのように使用しますか?