【问题标题】:php password_hash and password_verify looked all over still doesn't workphp password_hash 和 password_verify 看了一遍还是不行
【发布时间】:2014-11-20 20:41:38
【问题描述】:

更新 所以这是一个令人尴尬的愚蠢承认,但问题是我存储在数据库中的哈希是“密码”的哈希包括引号,我写的查询没有问题,问题出在椅子和键盘之间。

所以这是一个经常被问到的问题,我已经查看了整个 stackoverflow 和谷歌试图找出答案,但一直没有成功。

我有一个“代理”表,其中为每个代理分配了登录名和密码。密码字段是一个长度为 255 的 varchar。

这是我的 php 代码:

     $conn = new mysqli( "localhost", "VABEN", "**********", "VABen" );
     if( $conn->connect_error )
     {
        die( "Connection failed!" . $conn->connect_error );
     }
     $username = $_POST["username"];
     $password = $_POST["password"];

     $s = $conn->prepare( "SELECT `agent_password` FROM `VABen`.`agents` WHERE `agent_login`=?" );
     $s->bind_param( "s", $username );
     $s->execute();

     $hash = $s->get_result();
     $hash = $hash->fetch_array( MYSQLI_ASSOC );

     $testpw = password_hash( 'password', PASSWORD_DEFAULT );
     echo "Comparing submitted password to locally created hash $testpw which has a length of " . strlen($testpw) . "<br>";
     if( password_verify( $password, $testpw ) )
     {
        echo "Password '$password' matches with hash $testpw<br>";
     }
     else
     {
        echo "Password '$password' does not match with hash $testpw<br>";
     }
     echo "<br>";

     echo "Supplied Password: '$password'<br>";
     echo "Queried Hash: " . $hash['agent_password'] . " which has a length of " . strlen( $hash['agent_password'] ) . "<br>";
     echo "Result of password_verify: ";
     if( password_verify( $password, $hash['agent_password'] ) )
        echo "true<br>";
     else
        echo "false<br>";

我很茫然。它似乎只在我提供本地创建的 password_hash 副本时才起作用,如果我随后在 MySQL 数据库中使用该本地创建的副本,它就会失败。

有什么想法吗?

【问题讨论】:

  • 澄清一下,当我提供本地制作的 password_hash 副本时,password_verify 返回 true,但当我提供从 MySQL 表中提取的哈希时则不会。
  • 所以$testpw 的测试工作正常吗?然后我只能想到将哈希保存到数据库中以某种方式出错。当您先保存$testpw,然后从数据库中选择该记录时会发生什么?
  • @ircmaxell--password_verify 返回 false,据我所知,它应该返回 true。
  • @Ronald01990-- $testpw 有效,它使用 password_hash 函数保存“密码”的哈希值。我会看看我是否可以插入一个新的登录,然后立即测试它。

标签: php mysql mysqli password-hash php-password-hash


【解决方案1】:

存储哈希

您是否检查过agent_password 正在存储由以下人员生成的哈希:

password_hash( $password, PASSWORD_DEFAULT );

检查 PDO 标准

可能没有效果,但对于bindParam 的不同实现,值得遵循标准。如果您使用的是? 方法,那么:

 $s->bind_param( 1, $username );

您的脚本中有几个奇怪的 PDO 实现,请尝试调整:

 $s->execute();

 //$hash = $s->get_result();
 //$hash = $hash->fetch_array( MYSQLI_ASSOC );
 $hash = $s->fetchColumn();

$hash['agent_password'] 的后续调用改为仅$hash

测试基本操作

测试以下内容:

// $password = $_POST["password"];
$password = "password";

然后,在最后的验证步骤之前,也尝试存储该哈希,并从 mysql 再次检索它。

终于

我深深怀疑agent_password 中存储的内容实际上不是password_hash 散列的密码。

【讨论】:

  • 这是我上面的输出:Comparing password to locally created hash $2y$10$NrTgd5b.qVnhs.smiZemHOQWM8PQ8q11Sfiyw1Bm1Wex6t3qpE6aa which has a length of 60``Password 'password' matches with hash $2y$10$NrTgd5b.qVnhs.smiZemHOQWM8PQ8q11Sfiyw1Bm1Wex6t3qpE6aaSupplied Password: 'password'``Queried Hash: $2y$10$668gODHJ14N7Z6i17lboLOHBQ6mkdxz3g99brUoeoxRBHSeri80ZK which has a length of 60``Result of password_verify: false
  • 嗯,你有它。提供的密码与存储的密码哈希不匹配。也许PASSWORD_DEFAULT 在创建密码后发生了变化?
  • 你有那个用户的原始密码吗?
  • 是的,你是对的,我也把它放在我的主帖中,但我所做的是散列 'password' with 引号,所以它是散列 "'密码'”而不是“密码”
  • 哈!它总是最终归结为简单的事情不是吗。我很高兴你已经弄明白了,很抱歉你不得不花这么多时间在上面。你肯定不是唯一一个犯这样的错误的人。
猜你喜欢
  • 2022-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2015-05-10
相关资源
最近更新 更多