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

时间:2016-11-13 05:35:40

标签: php authentication bcrypt php-password-hash

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

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

以下是我遇到问题的代码示例($ 2y $ identifier不会返回true)。

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

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

以下是正在运行的代码示例($ 2a $ encryption不是由password_hash函数生成的)。

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

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

我怀疑原始哈希和/或trim()中可能引入了空格,或者某些可能是由用户引入的。

我以前经常见过这样的案例。

如果是这种情况,请echo $var = password_hash("testing", PASSWORD_DEFAULT)."\n";

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

{{1}}

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