为什么password_verify
会返回false?
此问题旨在规范,并且仅根据有关此主题的问题数量创建。
答案 0 :(得分:3)
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的支持。