密码哈希不匹配,我做错了什么?

时间:2012-10-24 17:05:41

标签: php security hash mysqli

我在网站上注册用户时有这种方法来散列密码。它完全可以理解,我将$ password_hash和$ salt存储在我的数据库中。但是当我尝试验证用户登录时,问题就发生了,我得到的哈希值不匹配。

注册功能

$salt = createSalt();
$password = createPassword();
$hash = hash('sha256', $password);
$password_hash = hash('sha256', $salt . $hash);

登录功能

$query = "SELECT Password_Hash,Salt FROM accounts WHERE Email = ' ".$email." ' ";
$result = mysqli_query($mysqli, $query);
$rows = mysqli_fetch_assoc($result);
$hash = hash('sha256', $password);
$password_hash = hash('sha256', $rows['Salt'] . $hash);

创建密码功能

function createPassword()
{ /*This function is used to create the password for the user */
    $alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
    for ($i = 0; $i < 8; $i++) 
    {
        $n = rand(0, strlen($alphabet)-1);
        $pass[$i] = $alphabet[$n];
    }
    return implode($pass);
}

两个密码哈希值不匹配。有什么我做错了吗?输出结果如下图所示。第一行是DB输出 enter image description here

2 个答案:

答案 0 :(得分:0)

有两种可能性:

  • 你正在存储错误的盐(你不应该在你的数据库中存储任何盐)
  • 您正在插入不同的密码......

我强烈建议您使用用户数据创建salt,例如:

$salt = $userEmail . $userID . 'yourString';

并且不要将这个盐放在数据库中,只是每次动态计算它,也不需要对盐进行哈希处理。你可以像这样直接连接它:

$hash = hash( $password . $salt );

答案 1 :(得分:0)

当散列密码时,这是3个常见错误

  • 案例敏感度
  • 白色空间

在进行哈希处理之前和身份验证之前,请尝试使用trim密码。

实施例

 echo hash('sha256', "pass"); //d74ff0ee8da3b9806b18c877dbf29bbde50b5bd8e4dad7a3a725000feb82e8f1

echo hash('sha256', " pass"); //f2752b292e1333b2d224a1f831e3ce866dbfc7a32da2af4d1092135f5a2c9383
                     ^----- Just this space makes a huge diffrence

修改

来自var_dump http://pastebin.com/4NtuANzj

登记

$password_hash =   string(64) "f8fe50b60e3c71dbcc805484352b449df06b2a810cf7d93294e644093a6f60ac" ;

$db_pass_hash = $rows['Password_Hash'];

$db_pass_hash =  string(66) " f8fe50b60e3c71dbcc805484352b449df06b2a810cf7d93294e644093a6f60ac "
                             ^---- empty space

解决方案

$db_pass_hash = trim($rows['Password_Hash']);
$db_salt = trim($rows['Salt']);