【问题标题】:password_verify() is always returning false [duplicate]password_verify() 总是返回 false [重复]
【发布时间】:2018-11-02 22:10:16
【问题描述】:

我正在使用带两个参数的 password_verify,即存储在数据库中的哈希值和用户输入的实际密码。 代码如下:

$pass = filter_input(INPUT_GET, 'password', FILTER_DEFAULT);
// connecting to the database and executing query, the password is stored in $dpass

  if(password_verify($pass,$dpass))
     echo "Hello User " .  $dname;

else
  echo "Login incomplete";

现在只是为了澄清:

  • 我数据库中的Password 列是varchar(256)
  • 注册时使用与登录时相同的过滤功能
  • 我尝试password_verify() 我的密码与注册期间出现的哈希值相同,但没有使用数据库返回值(回显哈希、复制和粘贴)
  • 我回显了哈希值和输入的密码值,它们都是正确的
  • BCRYPTDEFAULT 我都试过了,但都没有正确验证

可能是什么问题?

【问题讨论】:

  • 数据库中的密码哈希是用password_hash创建的吗?只是确保...
  • 如果password_verify($pass, password_hash($pass, PASSWORD_DEFAULT))“有效”,那么问题是 $dpass 不包含预期的内容 - 包括未正确生成(所以它包含的 是什么,以及为什么不符合预期?)。如果它“不起作用”,则 another 行会导致观察到的行为。这两种结果都允许专注于精炼的问题集。
  • @Don'tPanic 当然是的
  • @user2864740 非常感谢!我正在寻找这样的建议来帮助我更好地识别问题,我会尝试并评论我的结果
  • 是的,你会认为“当然”,但我看到很多问题并非如此,所以我总是问。无冒犯

标签: php password-hash


【解决方案1】:

感谢大家的回答,在我对每一行运行 echo $pass 后,我注意到在代码中的某个时刻它从原来的值变为另一个值,我再次检查了它,显然变量 $pass用于dbconnect.php 文件,该文件包含在包含我的数据库配置和设置的代码中,它使用变量$pass 来存储数据库密码,这就是改变密码值的原因,我将 $pass 固定为 $usrPass一切正常。

因此,对于将来遇到此问题并看到此问题的任何人,以下是导致 password_verify() 不起作用的最常见错误:

  • 在存储哈希值时使用双引号($hash = "$2$ds$fdajja..."; 使用双引号会使 PHP 将 $2 $ds$fdajja... 读取为单独的变量,这可能会导致您的代码中断,请改用单引号。李>
  • 回显哈希值和输入值,并确保它们与password_hash() 期间插入和生成的值匹配
  • 如果数据库值不同(散列),请确保其列的类型为varchar(256),散列通常为60个字符长,但散列函数经常改进,以便将来可能扩大长度。
  • 如果输入的值不同(用户密码),请确保过滤不会破坏密码值,同时检查另一个变量是否与您存储密码的变量同名
  • 如果 password_verify($pass, password_hash($pass, PASSWORD_DEFAULT)) “有效”,那么问题是 $dpass 不包含预期的内容 - 包括未正确生成(所以它包含什么,为什么它不像预期的那样?)。如果它“不起作用”,那么另一条线会导致观察到的行为。这两种结果都允许专注于精炼的问题集。感谢user2864740 指出这一点。

编辑:伙计们,密码过滤功能根本没有做任何事情,因为无论如何都没有要过滤的东西,对于那些不熟悉它的人来说,这个功能基本上可以工作输入参数,它适用于 GET 和 POST 输入,因为我仍在做后端部分,所以我使用 GET 进行测试。

【讨论】:

  • 您应该按照要求在您的问题中发布。我们/我会马上意识到这一点。编辑:这就是为什么我投票决定关闭。
  • 你写的所有东西,都已经存在很多重复了。你没有说什么新东西,所以恕我直言;这不会对已经询问的内容添加任何特殊内容。
  • 是的,我知道它已经存在于不同的帖子中,我想删除整个问题,但决定在一个答案中总结我对该问题的所有研究和经验,以帮助其他人在没有所有问题的情况下找到他们的错误我遇到的麻烦。
  • 这有点跑题了,但是如果您只是更改了变量名并且一切正常,看起来(因为您在过滤器中使用INPUT_GET)正在发送密码url 查询字符串,它将公开纯文本密码。
  • @user2196985 哦,好吧,"c'est la vie" :) 我很高兴您正在学习并继续使用良好和安全的做法。 干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
相关资源
最近更新 更多