Password_verify无法正确检查

时间:2016-12-28 21:28:28

标签: php passwords

password_verify的大问题。

在我的数据库中有一列:

password:  $2y$10$1k72g4qYgd4t5koC5hj8sOit3545GfO5EhaIwVRfIiA2/eC3Hnu5e ('b')

当我想检查这个密码是否等于字母a时,它给出了我完全2个不同的代码。我的代码:

$hash = password_hash('b', PASSWORD_DEFAULT);
$pass = getPassword($email);
echo $hash . ", " $pass;

它给了我:

$2y$10$oJbeQqGSee.pLcBNxqRzUecoCGc9fin7IF.evDVanN1pjmtIINSD2,
$2y$10$1k72g4qYgd4t5koC5hj8sOit3545GfO5EhaIwVRfIiA2/eC3Hnu5e

为什么有不同?

2 个答案:

答案 0 :(得分:2)

这是因为当用户未指定时,password_hash将生成随机 salt 。 Salt是在散列之前附加到密码的字符串。由于盐是随机的,两个具有相同密码的用户在数据库中仍然会有不同的哈希值。

可以找到该主题的完整摘要on the wikipedia

为了验证密码是否正确,您不应手动比较哈希值,因为随机盐,每次使用password_hash时可能会有所不同,而是使用函数password_verify

答案 1 :(得分:1)

您应该在插入存储空间之前使用password_hash(),然后在验证时应使用password_verify()

$pass = getPassword($email);
$verify = password_verify('b', $pass);

if ($verify) {
     // passwords match
}
else {
    // passwords do not match
}

有关详细信息,请参阅:password-verify