为什么password_verify返回false?

时间:2018-06-18 13:18:12

标签: php password-hash php-password-hash

为什么password_verify会返回false?

此问题旨在规范,并且仅根据有关此主题的问题数量创建。

1 个答案:

答案 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而不是其他东西。

Repl

硬编码密码

在您使用硬编码哈希并且遇到问题的实例中,确保在将值存储在变量中时使用单引号而不是双引号,因为在使用时将解释$双引号:

<?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的支持。