-1

当我在我的网站上注册用户时,我有这种方法来散列密码。据我所知,它完美地工作,我将 $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);
}

两个密码哈希不匹配。有什么我做错了吗?输出下方的图像。第一行是数据库输出 在此处输入图像描述

4

3 回答 3

0

有两种可能:

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

我强烈建议您从用户数据中创建盐,例如:

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

并且不要将此盐放入数据库中,只需每次即时计算即可,盐也不需要散列。您可以像这样直接连接它:

$hash = hash( $password . $salt );
于 2012-10-24T17:10:07.357 回答
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']);
于 2012-10-24T17:19:40.203 回答
0

这可能是一个逻辑错误,与您的代码无关 - 检查密码列的长度/大小。如果密码在存储时被连接,它们将不匹配 - 您不会收到任何错误。

请注意,根据您使用的哈希,存储的哈希密码比用户输入的密码长得多(研究您使用的哈希长度),即使它是一个字母。

于 2021-10-29T02:39:03.560 回答