php password_hash 和 password_verify 看了一遍还是不行

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

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

所以这是一个经常被问到的问题,我查看了整个 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 数据库中使用该本地创建的副本,它就会失败。

有什么想法吗?

最佳答案

存储哈希

您是否检查过 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散列的密码。

关于php password_hash 和 password_verify 看了一遍还是不行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27049154/

相关文章:

mysql - 将 mysql 数据库转换为 pg 数据库

mysql - mysql 中关于过程参数的动态 "column"更新

mysql - 如何检查记录不包含特定字符串?

php - 使用 PHP 脚本从下拉列表更新 SQL 数据库

javascript - php 变量正在更新,但 javascript 函数始终显示第一个值

javascript - 如何动态地将图像放入框中?

php - 在 CodeIgniter 中检索 JSON POST 数据

php - 警告 : mysqli_connect(): (HY000/1045): Access denied for user 'username' @'localhost' (using password: YES)

php - 扩展 mysqli_result - 它使用 store_result() 还是 use_result()

php - 如何在php中连接两个mysql表