Php 密码\u验证无法使用数据库中的哈希\u字符串

Php 密码\u验证无法使用数据库中的哈希\u字符串,php,Php,当我使用PDO从MySQL检索bcrypt哈希时 $password_hash = $result_set_database['hash_value']; 并用它来验证 if(password_verify($password, $password_hash)) { echo "valid";} else {echo "invalid";} 作为响应,我总是变得无效,但我尝试过像这样手动编码散列 $password_hash = '$2y$12$rSMqbIqhOga5Qnbv9dC

当我使用PDO从MySQL检索bcrypt哈希时

$password_hash = $result_set_database['hash_value'];
并用它来验证

if(password_verify($password, $password_hash))
  { echo "valid";}
else
  {echo "invalid";}
作为响应,我总是变得无效,但我尝试过像这样手动编码散列

$password_hash = '$2y$12$rSMqbIqhOga5Qnbv9dCfoeE4HRqJKyJqSRk8c8bUl9w.cVkXVfsdW'// string is "password"
现在它可以用于密码验证,但是对于存储在数据库中的相同哈希值

“我的数据库密码哈希”列的大小为255 varchar


为什么会发生这种情况?

我做了一个快速测试:

$password = 'password';
$hash     = password_hash($password, PASSWORD_DEFAULT);
$dbHash   = '$2y$12$rSMqbIqhOga5Qnbv9dCfoeE4HRqJKyJqSRk8c8bUl9w.cVkXVfsdW';

$result   = password_verify($password, $hash);
$dbResult = password_verify($password, $dbHash);

var_dump($result);
var_dump($dbResult);
在这两种情况下,我们都得到
true

boolean true
boolean true

strlen($password\u hash)
给出了61,在哈希中添加了一个空格,我怀疑这与
PDO
有关,在检查之前使用
trim($password\u hash)
解决了问题

如何从DB检索哈希?您也可以粘贴该代码段吗?您应该使用
password\u hash
生成密码散列,以使用
password\u verify()
函数
这与password\u verify一起工作,但不适用于存储在数据库中的相同散列值
——这意味着当您将其从数据库中拉出时,你没有使用你所期望的。
strlen($password\u hash)
give61而不是60。PDO在我的hash末尾添加了一个空格!这是一件非常有趣的事情。Mayby列已将长度设置为
61
?或者在抓取过程中不知何故添加了一个空格?虚拟解决方案可以使用
trim
方法。
一个由PDO添加的空白
——也许这不是你的意思,但这句话不会是真的。PDO只做您告诉它的事情,它不会通过在事物上随机添加空格来操纵您的数据库数据。