编程语言
首页 > 编程语言> > php – 为什么password_verify返回false?

php – 为什么password_verify返回false?

作者:互联网

为什么password_verify返回false?

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

解决方法:

password_verify可能返回false的原因有多种,包括从表的设置到密码的实际比较,下面是它失败的常见原因.

列设置

>表中密码列的长度太短:

>如果您使用的是PASSWORD_DEFAULT,则建议将结果存储在数据库列中,该列可以扩展到超过60个字符(255个字符将是一个不错的选择).
>如果使用的是PASSWORD_BCRYPT,则建议将结果存储在60个字符的数据库列中,因为PASSWORD_BCRYPT将始终生成60个字符的字符串,如果失败则为FALSE.

密码清理

另一个常见原因是当开发人员试图“清理”用户的密码以防止其被恶意时,结果导致输入与存储在表中的输入不同.甚至不需要转义输入,您应该使用预准备语句.您甚至不应该修剪密码,因为这可能会改变最初提供的密码.

密码验证

使用password_verify时,您需要将明文密码与数据库/文件/ some-other-storage-method中的哈希值进行比较,而不是比较哈希值(这意味着您需要在注册时存储用户的哈希密码) ):

<?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()在您将数据插入数据库之前的注册权限上的哈希密码,以及在您将要使用password_verify()时从数据库中获取它后再次使用var_dump().确保两个哈希值相同.如果是,并且明文密码也相同,则password_verify没有理由失败.只有当哈希在通过数据库的往返中以某种方式被修改,或者如果明文密码不相同时,它才会失败.

确保您传递正确的算法到password_hash有第二个参数.

附录

根据文件:

Caution It is strongly recommended that you do not generate your own salt for this function. It will create a secure salt automatically for you if you do not specify one.

As noted above, providing the salt option in PHP 7.0 will generate a deprecation warning. Support for providing a salt manually may be removed in a future PHP release.

标签:password-hash,php-password-hash,php
来源: https://codeday.me/bug/20190923/1814130.html