注册和登录时PHP密码哈希不相同


PHP password hash not the same when registering and logging in

当用户注册并登录时,我使用相同的password_hash函数对纯文本密码进行散列。

password_hash($password, PASSWORD_DEFAULT)

但是密码不同。

我可以用另一种方式证明这一点,只需用相同的密码注册两个用户。

例如,"admin"变为"$2y$10$SyqILazLbo4jJVYvxYfwW.WgHUnSi.cRMETWoMjZXwMNa4H4tYELK"

在一个用户上为"$2y$10$gXfVz6oH4afxAL.7ytFJseZV3VERxbSYXqN7FYsRzH4IrjJw9uyO6"。这意味着password_hash将永远不会相同,因此用户永远无法登录

我做错了什么?

您需要使用password_verify来验证密码是否正确。像这样的

<?php
$password = "rasmuslerdorf";
$hash =  password_hash($password, PASSWORD_DEFAULT);
if (password_verify($password, $hash)) {
  echo 'Password is valid!';
} else {
  echo 'Invalid password.';
}
?>

参考页面

您需要使用函数password_verify($user_submitted_password, $hash_in_db)来检查结果。password_hash()在每个哈希中嵌入一个随机salt,这就是为什么密钥不同,但它会正确验证。

参见password_verify() 文档中的示例

<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>