我正在使用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值,然后将其应用于散列第一个参数。然后将结果与以前散列的密码进行比较。这就是为什么这是如此混乱。我不必给它一个盐值 - 盐在数据库中。我误解了这个函数发生了什么?
我原本散列与此代码的密码:
$salt = uniqid();
$algo = '6';
$rounds = '5000';
$cryptSalt = '$' . $algo . '$rounds=' . $rounds . '$' . $salt;
$hashedPassword = crypt($plaintext, $cryptSalt);
也许您正在使用来自数据库的加密密码作为盐?请参阅['crypt'](http://us1.php.net/manual/en/function.crypt.php) – Jon
最好使用可信任的外部来源进行单向加密。一个我发现有用:https://github.com/SlayerSolutions/Authentication/blob/master/Downloads/Version%202%20%28Class%29.php或https://github.com/ircmaxell/PHP-PasswordLib –
为了给出一个有意义的答案,你需要知道hashed_password是如何进入db的,它是如何散列的?并且你知道它的crypt()实际上会散列currentPlaintext密码的方式与你生成hashed_password的方式相同吗? 因此,总结一下,关于如何处理哈希以提供有意义的答案,很少有信息 –