为什么password_verify返回false?

问题描述 投票:-2回答:1

为什么password_verify会返回false?

此问题旨在规范,并且仅根据针对此主题提出的问题数量创建。

php password-hash php-password-hash
1个回答
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的支持。

© www.soinside.com 2019 - 2024. All rights reserved.