【问题标题】:Password hashes don't match, what am I doing wrong? [closed]密码哈希不匹配,我做错了什么? [关闭]
【发布时间】:2012-10-14 18:49:43
【问题描述】:

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

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

【问题讨论】:

  • 是的,但是随机密码是通过电子邮件发送给用户的。
  • 这是我的表格结构的图像。 i.imgur.com/J1HOq.png 和 var_dump($password) 是 " string(8) "T82OksQy" "

标签: php security hash mysqli


【解决方案1】:

在哈希密码时,这是 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']);

【讨论】:

  • 听取了您的建议并使用了 Trim 功能,但似乎没有任何改变:(
  • 这就是我想要的...var_dump($password,$hash,$password_hash) 在您保存到数据库之前和从数据库中检索之后...您可以将其添加到 pastebin
  • 给你,伙计,希望我已经为你提供了你需要的所有信息。 pastebin.com/4NtuANzj
  • 大声笑..我可以清楚地看到你做错了什么..它仍然是空白
  • 是的,其中一个字符串是 (66) 如何从中删除空格?
【解决方案2】:

有两种可能:

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

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

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

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

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

【讨论】:

  • 肯定使用该信息,如果我的服务器遭到入侵,使用用户、电子邮件和用户 ID 和字符串(我猜是存储在某些地方)可以“破解”它只是一样不?
  • 如果他们只破坏了您的数据库,那么您的密码是安全的...如果他们破坏了您的所有服务器,您将无能为力。但是无论如何都不需要将盐存储在数据库中
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 2015-04-05
    • 2020-01-11
    • 2013-05-19
    • 2015-04-29
    • 2012-11-07
    • 2013-02-08
    • 2017-04-21
    相关资源
    最近更新 更多