为什么 php password_verify 和 password_hash 使用不同的加密标识符?

Why is php password_verify and password_hash using different encryption identifiers?

经过一些故障排除后,我确定当我使用 PHP 的 password_hash 函数散列密码时,加密标识符是 $2y$。但是,当我使用 password_verify 函数将存储的散列密码与用户输入的密码进行比较时, password_verify 不会 return 为真。如果我使用 https://www.bcrypt-generator.com/ 上的 $2a$ 标识符生成新密码并用它替换存储的散列密码,它 return 是正确的。

我希望有人能解释为什么 password_hash($password, PASSWORD_DEFAULT) 使用 $2y$ 以及为什么 password_verify() 使用 $2a$。或者我在这里可能做错的任何其他事情。我在 WAMP 服务器 运行 PHP 版本 7.0.10.

上本地执行此操作

这是我遇到问题的代码示例($2y$ 标识符不会 return true)。

<?php
// $hashNotWorking came from password_hash("testing", PASSWORD_DEFAULT)."\n";
$hashNotWorking = 'y$DNPos6f7Vo4Z2IrYU./eCObD7BMkwlkK9yiYjb0hvnI14B1dbFHbC';

if (password_verify('testing', $hashNotWorking)) {
 echo 'Password is valid!';
} else {
 echo 'Invalid password.';
}
?>

这是一个有效的代码示例($2a$ 加密不是由 password_hash 函数生成的)。

<?php
// $hashWorking came from https://www.bcrypt-generator.com/
$hashWorking = 'a$uP75n/pDhUZo6qOOM3DuPug5U2fcSXW4f3MUz8p3SlO5yPZ4fLf9O';

if (password_verify('testing', $hashWorking)) {
 echo 'Password is valid!';
} else {
 echo 'Invalid password.';
}
?>

我怀疑原始哈希 and/or a <br> 中可能引入了空格,或者一些可能是用户引入的。

我以前也经常遇到这种情况。

如果是这样,trim()它。

按照我在评论中提到的内容创建一个新哈希,它会起作用。

echo $var = password_hash("testing", PASSWORD_DEFAULT)."\n";

然后将其粘贴到您当前的哈希位置。