-1

パスワードの暗号化に SHA-512 を使用しています。私はすべてを正しく行っていると思います (そして、他の場所で成功しているコードを複製することさえあります) が、パスワードを入力しようとするたびに、データベースに保存したものと一致しません。

$sql = "SELECT hashed_password FROM Users WHERE user_name='$username'";
$result = mysql_query($sql);
$db_password = mysql_result($result, 0);

if (crypt($currentPlaintext, $db_password) != $db_password) {
    echo "Your current password is incorrect.";
    die();
}

次の明らかな潜在的な問題を確認し、原因としてそれらを排除しました。

1) データベースに暗号化されたパスワードが保存されている

2) このパスワードを取得し、変数 $db_password に保存できます

3) 変数 $username と $currentPlaintext には、私の ajax 関数呼び出しによって渡された正しい値があります。

では、なぜこれが機能しないのでしょうか。明らかな何かが欠けていますか?ありがとう!

編集:これまでのコメントをありがとう。明確にするために、crypt() 関数を理解しているので、crypt の 2 番目の引数は、実際には db に格納されている文字列全体です。この文字列には、ハッシュされたパスワードだけでなく、アルゴリズム、salt 値、およびハッシュのラウンド数も含まれます。crypt() 関数は、この文字列からソルト値を引き出し、それを適用して最初の引数をハッシュすることになっています。その結果は、以前にハッシュされたパスワードと比較されます。だからこそ、これはとても混乱しています。ソルト値を指定する必要はありません。ソルトはデータベースにあります。この関数で何が起こっているのか誤解していますか?

私はもともとこのコードでパスワードをハッシュしました:

$salt = uniqid();
$algo = '6';
$rounds = '5000';
$cryptSalt = '$' . $algo . '$rounds=' . $rounds . '$' . $salt;
$hashedPassword = crypt($plaintext, $cryptSalt);
4

3 に答える 3

0

かどうかを確認します

crypt($plaintext, $pass) == $pass

crypt のマニュアルを見ると、crypt の 2 番目の引数が$salt. したがって、ハッシュを作成したときに使用したソルトを与える必要があります。ソルトを使用しない場合 (使用する必要があります)、この 2 番目の引数を削除してみてください。

于 2013-07-07T22:19:21.343 に答える
0

本当に Sha512 を使用していますか? システムによっては、crypt() は異なるアルゴリズムを使用する場合があります。

于 2013-07-07T22:22:05.620 に答える
0

PHPのcrypt関数は、必ずしも SHA512 ハッシュを返すとは限りません。

hash('sha512', $currentPlaintext)代わりに使用してください。

于 2013-07-07T22:22:20.753 に答える