为什么 password_verify 返回 false?

问题描述 投票:0回答:3

我正在使用

password_verify
检查我的散列密码。我有 PHP 5.5:

// get result row (as an object)
$result_row = $result_of_login_check->fetch_object();

// using PHP 5.5's password_verify() function to check if the provided password fits
// the hash of that user's password
if (password_verify($_POST['user_password'], $result_row->user_password_hash)) {
    // ...
}

我在

false
上得到
password_verify
。我已经检查过帖子值和 mysql user_password_hash 返回。

我不知道为什么它返回 false.

有什么想法吗?

php passwords password-hash php-password-hash
3个回答
22
投票

问题可能出在您的列长度上,来自手册: 建议将结果存储在可以扩展到 60 个字符以上的数据库列中(255 个字符将是一个不错的选择)。 link


11
投票

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';
}

?>

回复

硬编码密码

在您使用硬编码哈希并遇到问题的情况下,确保在将值存储在变量中时使用单引号而不是双引号,因为

$
将在使用双引号时解释:

<?php
// Undefined variable: QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu :1
$incorrect = "$2y$10$QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu";

$correct = '$2y$10$QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu';
?>

Repl - 分别注释掉。

附录

根据文档:

警告 强烈建议您不要为此函数生成自己的盐。如果您不指定,它将自动为您创建一个安全盐。

如上所述,在 PHP 7.0 中提供 salt 选项将生成弃用警告。在未来的 PHP 版本中可能会删除对手动提供盐的支持。


0
投票

检查参数顺序

只是指出发生在我身上的事情,几分钟前我正在阅读同一主题试图解决我的问题,并且也可以帮助您解决问题。
查看您是否以正确的顺序为 password_verify() 提供参数:

password_verify(字符串$password,字符串$hash

密码 是您通过邮寄或其他方式收到并正在尝试验证的密码。

hash 是您要将密码与之进行比较的哈希。(例如,存储在数据库中的密码哈希)

碰巧我颠倒了参数的顺序,所以结果并没有像我预期的那样。

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