无法验证哈希密码

时间:2013-07-07 22:14:15

标签: php php-password-hash

我正在使用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);

3 个答案:

答案 0 :(得分:0)

你检查是否

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

查看crypt手册,您会看到crypt的第二个参数是$salt。因此,您需要为其创建在创建哈希时使用的盐。如果你不使用salt(你应该这样做),那么尝试删除第二个参数。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

改为使用hash('sha512', $currentPlaintext)