php密码\u散列和密码\u验证到处都看了仍然不起作用

php密码\u散列和密码\u验证到处都看了仍然不起作用,php,mysql,mysqli,password-hash,php-password-hash,Php,Mysql,Mysqli,Password Hash,Php Password Hash,更新 因此,这是一个令人尴尬的愚蠢的承认,但问题是,我在数据库中存储的哈希是一个“密码”的哈希,包括引号,我写的查询没有问题,问题是在椅子和键盘之间 这是一个经常被问到的问题,我在stackoverflow和google上到处寻找答案,但都没有成功 我有一个为每个代理分配了登录名和密码的代理表。密码字段是长度为255的varchar 以下是我的php代码: $conn = new mysqli( "localhost", "VABEN", "**********", "VABen" )

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

这是一个经常被问到的问题,我在stackoverflow和google上到处寻找答案,但都没有成功

我有一个为每个代理分配了登录名和密码的代理表。密码字段是长度为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, 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\u password']的后续调用改为仅$hash

测试基本操作 测试以下各项:

// $password = $_POST["password"];
$password = "password";
然后,在最后的验证步骤之前,尝试存储该散列,并再次从mysql检索它

最后
我深深怀疑agent\u password中存储的内容实际上并不是用password\u hash散列的密码。

为了澄清这一点,当我提供password\u hash的本地副本时,password\u verify返回true,但当我提供从MySQL表中提取的散列时,password\u verify返回true。因此,使用$testpw的测试工作正常吗?然后,我只能考虑将散列保存到数据库中,但不知何故出现了错误。当您先保存$testpw,然后从数据库中选择该记录时,会发生什么情况?@ircmaxell-password\u verify返回false当我看到它应该返回true时。@Ronald01990-$testpw工作时,它使用password\u散列函数保存“password”的散列。我将看看是否可以插入新登录名,然后立即测试它。这是我上面的输出:将密码与本地创建的哈希值$2y$10$NrTgd5b.qVnhs.smiZemHOQWM8PQ8q11Sfiyw1Bm1Wex6t3qpE6aa进行比较,该哈希值$2y$10$NrTgd5b.qVnhs.smiZemHOQWM8PQ8q11Sfiyw1Bm1Wex6t3qpE6aa的长度为60``密码'password'与哈希值$2y$10$NrTgd5b.qVnhs.SmizemHoqWM8PQ8Q11BF1BF1BM1WEX6提供的密码:“Password”`查询的哈希值:$2y$10$668GODHJ14N7Z6I17LBOLOHBQ6MKDXZ3G99BROUOEOXRBHSERI80ZK,长度为60``密码结果\u验证:Falswell,您有密码了。提供的密码与存储的密码哈希不匹配。也许是因为密码被创建后,默认密码发生了变化?你有该用户的原始密码吗?是的,你是对的,我也把它放在了我的主要帖子中,但我所做的是用引号散列“PASSWORD”,所以它是散列“PASSWORD”而不是passwordHa!它总是归结为简单的事情,不是吗。我很高兴你弄明白了,很抱歉你花了这么多时间。你肯定不是唯一犯这种错误的人。