使用完全相同的输入散列密码不会输出相同的值

时间:2013-03-13 20:47:25

标签: php encryption sha256

如果您在我的网站上注册,我正在尝试哈希密码,但它不起作用。 这是我在注册时哈希密码的代码:

$escapedName = mysql_real_escape_string($_POST['user']); 
$escapedPW = mysql_real_escape_string($_POST['password']);

$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

$hashedPW = hash('sha256', $escapedPW . $salt);

然后我只是将它插入数据库(散列密码和盐)。 例如,当我使用以下盐哈希Sas时: abac7ad23185ad19967f0d13e962197962782f0b7ec32d9889c27a93a9e800fa
这是哈希密码:
8ca5c5f31fafbf382533dbcbfc22b3635d776ec7770c7eac58d8ef9f1fa3613c

但是当我尝试在登录时使用完全相同的密码和盐来密码密码时,这就变成了散列传递:
6eb4b16444f18cee19db32bd29a39970e3019c5b1972a982ae4cb9a59642dffc

这是我用来登录的代码:

$escapedName = mysql_real_escape_string($_POST['user']);
$escapedPW = mysql_real_escape_string($_POST['password']);
$saltQuery = mysql_query("SELECT salt FROM members WHERE user='{$escapedName}'");
while($result = mysql_fetch_assoc($saltQuery)) {
    $salt = $result['salt'];
}

$hashedPW = hash('sha256', $escapedPW . $salt);

$sql = mysql_query("SELECT * FROM members WHERE user='$escapedName' AND pass='$hashedPW'; ");
while ($res = mysql_fetch_assoc($query2)) {
    $username = $res['user'];
    $PW = $res['pass'];
}

我希望代码不是太多,我也希望你能理解我的问题。

3 个答案:

答案 0 :(得分:1)

很抱歉,我无法发表评论,但有些事情告诉我数据库中的salt列存在长度限制。

示例:盐场可能只允许64个字符,而生成的盐可能更长,因此当您保存盐时,它会被修剪,最终会更改散列密码。

如果是这种情况,您可能需要在保存之前修剪盐。

我建议使用PDO对您的数据库进行查询。

答案 1 :(得分:1)

由于某种原因,您对哈希函数的输入必须不同。

在散列两个用例(创建用户和登录名)之前,添加打印输入的日志输出消息。还要确保在日志记录中输入引号以显示空白问题。

在两种情况下比较原始输入以及散列函数的输出,并且在某处会有差异。如果没有差异,并且哈希的输出相同,那么查询中的问题是在登录案例中查找用户。

答案 2 :(得分:0)

无论你做什么,如果你想要哈希是一样的话,这是不安全的!有关正确的密码哈希,请参阅http://php.net/crypt

所有你需要的:

function check_password($password) {  
    ...//get db password to compare
    if (crypt($post_password, $db_results[0]['password']) == $db_results[0]['password']) {  
        return true;  
    } else { return false; }
}