3

私は、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をどのように使用しますか?

4

2 に答える 2

0

また、すべてのパスワードに対してソルトは静的なままであるようです。これがどのように安全かわかりません。

bcryptの使い方を少し変える必要があります。実際のパスワードをパスワードパラメータとして渡さないでください。生成された「ソルト」文字列を文字列の先頭に追加、追加、または配置できます。次に、出力ハッシュとともにソルトをストレージに保存します。

ユーザーが自分のパスワードを入力してソルトを取得したら、ソルトとbcrypt()を使用して同じことを再度実行し、結果を保存されているハッシュと比較します。

このようにsaltを使用すると、@cloverが言及している通常のレインボーテーブルの使用がブロックされます。

また、通常、より単純な解決策がより良い解決策です。パスワードソルトには、単純なrand()で十分です。

于 2013-01-21T14:28:35.320 に答える
0

私が理解しているように、あなたの質問は「なぜ変数ソルトを使用したハッシュがより安全なのですか?」です。

1 つだけあります。それは常にブルートフォースであり、salt が一定の場合、たった 1 回のブルートフォース サイクルですべてのパスワードを「ハッキング」することができます。(ハッシュがデータベースからの 1 と等しい場合、ユーザーのパスワードがわかります)。

単純な md5() および sha1() ハッシュ関数の場合、ブルートフォースされたパスワードの生成されたハッシュをデータベースに保存することもできます (将来の使用のために)。このような方法により、ハッカーはほぼすべてのパスワードを数秒で特定できます。

于 2013-01-21T14:16:38.673 に答える