2013-07-07 70 views
-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值,然后将其应用于散列第一个参数。然后将结果与以前散列的密码进行比较。这就是为什么这是如此混乱。我不必给它一个盐值 - 盐在数据库中。我误解了这个函数发生了什么?

我原本散列与此代码的密码:

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

也许您正在使用来自数据库的加密密码作为盐?请参阅['crypt'](http://us1.php.net/manual/en/function.crypt.php) – Jon

+0

最好使用可信任的外部来源进行单向加密。一个我发现有用:https://github.com/SlayerSolutions/Authentication/blob/master/Downloads/Version%202%20%28Class%29.php或https://github.com/ircmaxell/PHP-PasswordLib –

+0

为了给出一个有意义的答案,你需要知道hashed_pa​​ssword是如何进入db的,它是如何散列的?并且你知道它的crypt()实际上会散列currentPlaintext密码的方式与你生成hashed_pa​​ssword的方式相同吗? 因此,总结一下,关于如何处理哈希以提供有意义的答案,很少有信息 –

回答

0

您是否

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

看着你看到地穴的第二个参数是$salt地穴手册。所以你需要给它创建哈希时使用的salt。如果你不使用盐(你应该这样做),然后尝试删除第二个参数。

0

您确定您使用的是Sha512吗?取决于系统,crypt()可能使用不同的算法。

0

PHP中crypt功能不一定返回的SHA512哈希值。

使用hash('sha512', $currentPlaintext)代替。