-1

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

3 回答 3

0

你检查是否

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

查看 crypt 手册,您会看到 crypt 的第二个参数是$salt. 所以你需要给它你在创建哈希时使用的盐。如果您不使用盐(您应该这样做),请尝试删除第二个参数。

于 2013-07-07T22:19:21.343 回答
0

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

于 2013-07-07T22:22:05.620 回答
0

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

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

于 2013-07-07T22:22:20.753 回答