为什么password_verify
会返回false?
此问题旨在规范,并且仅根据针对此主题提出的问题数量创建。
password_verify
可能返回false的原因有多种,包括从表的设置到密码的实际比较,下面是它失败的常见原因。
PASSWORD_DEFAULT
,则建议将结果存储在数据库列中,该列可以扩展到超过60个字符(255个字符将是一个不错的选择)。
如果您使用的是PASSWORD_BCRYPT
,则建议将结果存储在60个字符的数据库列中,因为PASSWORD_BCRYPT
将始终生成60个字符的字符串,如果失败则为FALSE。另一个常见原因是当开发人员试图“清理”用户的密码以防止其被恶意时,结果导致输入与存储在表中的输入不同。甚至不需要转义输入,您应该使用预准备语句。您甚至不应该密码trim
,因为这可能会改变最初提供的密码。
当使用password_verify
时,您需要将明文密码与数据库/文件/某些其他存储方法中的哈希值进行比较,而不是比较哈希值(这意味着您需要在注册时存储用户的哈希密码) ):
<?php
$hashed = password_hash('test', PASSWORD_DEFAULT);
$password = 'test';
if (password_verify($password, $hashed)) {
echo 'success';
} else {
echo 'fail';
}
?>
确保您实际上是通过转储将散列传递给password_verify
而不是其他东西。
在您使用硬编码哈希并且遇到问题的实例中,确保在将值存储在变量中时使用单引号而不是双引号,因为在使用双引号时将解释$
:
<?php
// Undefined variable: QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu :1
$incorrect = "$2y$10$QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu";
$correct = '$2y$10$QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu';
?>
Repl - 分别评论。
var_dump()
在您将数据插入数据库之前注册时的哈希密码,并且当您即将var_dump()
将数据库从数据库中取出时再次password_verify()
。确保两个哈希值相同。如果它们是,并且明文密码也是相同的,那么password_verify
就没有理由失败。只有当哈希在通过数据库的往返中以某种方式被修改,或者如果明文密码不相同时,它才会失败。
确保您传递正确的算法到password_hash
有第二个参数。
根据文件:
注意强烈建议您不要为此功能生成自己的盐。如果您没有指定,它将自动为您创建安全盐。
如上所述,在PHP 7.0中提供salt选项将生成弃用警告。在将来的PHP版本中,可能会删除对手动提供salt的支持。