我在网站上注册用户时有这种方法来散列密码。它完全可以理解,我将$ 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输出
答案 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']);