2

PHP の crypt() 関数が次のように機能することを理解しています。

crypt($password,$salt);

そして、bcrypt ハッシュ (非常に安全と見なされます) を作成するための形式は次のとおりです。

crypt("$2y$15$password",$salt);

$2y は bcrypt の使用を指定し、15 はラウンド数であり、10 を超える必要があります。

これが私の質問です。ランニング:

crypt("$2y$15$password");

私の理解では、素敵な大きなランダムソルトを生成してハッシュに追加し、パスワードを比較すると、これが自動的に抽出されます。これは、テーブルにソルト フィールドを用意したり、独自にソルトを生成したりする必要がないことを意味します。これは安全で正しいですか?

たとえば、実行すると:

$test = "Hello";
echo crypt("$2y$15$test") . "\n";

私は得る:

 $6$R59d/nemygl0$/Gk6s57K2eFAkH4BWDGYhfdhbYGcqz.GRbD7qGDKOlhE5Lk.kgCoGQo/sDCCf1VDffdh7jtXPn/9rsexwrpFk1 

最初の 6 は何らかのアルゴリズム番号を指し、2 つの $ の間の次のビットはソルトであり、その後のビットはハッシュです。これは正しいです?

また、検証のためにこのハッシュを別のハッシュと比較するための構文は何ですか? ありがとう。

4

2 に答える 2

2

あなたが使用しているcryptはSHA-512を使用していると思います。

crypt() のパラメーターとして $test を渡すのを忘れた可能性があります。

php docsによると、パスワードを最初の引数として (プレフィックスなしで) 渡し、2 番目の引数として $2y$15 プレフィックスと 22 文字のソルトを付けてソルトを渡す必要があります。例えば

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$');
于 2012-12-10T04:04:43.477 に答える
0

関数は次のcrypt()ように使用する必要があります。

$hashvalue = crypt($password, $cryptParams);

一方、ソルトは自分で生成する必要があり、$cryptParams の一部です。

$bcryptAlgo = '$2y';
$cost = '$15';
$salt = '$' . functionThatGenerates22CharRandomSalt();
$cryptParams = $bcryptAlgo . $cost . $salt;

困難の 1 つは、有効で一意の予測不可能なソルトを生成することです。できる最善の方法は、オペレーティング システムのランダム ソースから読み取ることです。

PHP 5.5 には独自の機能がpassword_hash()ありpassword_verify()、このタスクを簡素化する準備ができています。この優れた API を使用することを強くお勧めします。以前の PHP バージョン用の互換パックも用意されています。crypt の使用方法について詳しく知りたい場合は、この記事をご覧ください。

15 というコスト パラメータは非常に高いです。これだけの時間に余裕がある場合は使用してください。ただし、今日は 10 という数値で問題ありません。

于 2012-12-11T12:38:03.900 に答える