我正在使用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中的整个字符串。该字符串不仅包括散列密码,还包括算法,salt值和散列次数。 crypt()函数应该从该字符串中提取salt值,然后将其应用于哈希第一个参数。然后将结果与先前散列的密码进行比较。这就是为什么这太令人困惑了。我没有给它一个盐值 - 盐在数据库中。我误解了这个函数的作用吗?
我最初使用以下代码散列密码:
$salt = uniqid();
$algo = '6';
$rounds = '5000';
$cryptSalt = '$' . $algo . '$rounds=' . $rounds . '$' . $salt;
$hashedPassword = crypt($plaintext, $cryptSalt);
答案 0 :(得分:0)
你检查是否
crypt($plaintext, $pass) == $pass
查看crypt手册,您会看到crypt的第二个参数是$salt
。因此,您需要为其创建在创建哈希时使用的盐。如果你不使用salt(你应该这样做),那么尝试删除第二个参数。
答案 1 :(得分:0)
您确定使用的是Sha512吗?根据系统,crypt()可能会使用不同的算法。
答案 2 :(得分:0)
PHP中的crypt
函数不一定返回SHA512哈希。
改为使用hash('sha512', $currentPlaintext)
。