password_verify()始终返回false

时间:2018-11-02 22:10:17

标签: php password-hash

我正在使用带两个参数的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,但都没有正确验证

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

谢谢大家的回答,我在每行中运行echo $ pass之后,我注意到在代码中的某个时候它从原始值更改为另一个值,我再次检查了一下,显然是变量$ pass在dbconnect.php文件中使用,该文件包含在具有我的数据库配置和设置的代码中,它使用变量$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用于测试目的。