无法验证哈希密码


Not able to verify hashed password

我使用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的第二个参数实际上是存储在数据库中的整个字符串。这个字符串不仅包括散列密码,还包括算法、salt值和散列轮数。crypt()函数应该从这个字符串中提取salt值,然后将其应用于散列第一个参数。然后将结果与之前散列的密码进行比较。这就是为什么这件事如此令人困惑。我不必给它一个salt值——salt就在数据库中。我是不是误解了这个函数中发生的事情?

我最初用这个代码散列了密码:

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

您确定使用的是Sha512吗?根据系统的不同,crypt()可能会使用不同的算法。

检查

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

查看crypt手册,您会发现crypt的第二个参数是$salt。所以你需要给它你在创建哈希时使用的盐。如果你没有使用salt(你应该这样做),那么试着删除第二个参数。

PHP中的crypt函数不一定返回SHA512哈希。

请改用hash('sha512', $currentPlaintext)