我正在使用 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的第二个参数实际上是存储在db中的整个字符串。该字符串不仅包括哈希密码,还包括算法、盐值和哈希轮数。crypt() 函数应该从该字符串中提取盐值,然后将其应用于散列第一个参数。然后将结果与之前的散列密码进行比较。这就是为什么这很令人困惑。我不必给它一个盐值——盐就在数据库中。我误解了这个功能发生了什么吗?
我最初使用以下代码对密码进行哈希处理:
$salt = uniqid();
$algo = '6';
$rounds = '5000';
$cryptSalt = '$' . $algo . '$rounds=' . $rounds . '$' . $salt;
$hashedPassword = crypt($plaintext, $cryptSalt);