パスワードの暗号化に 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);