Php 将哈希密码绑定到SQL准备语句

Php 将哈希密码绑定到SQL准备语句,php,prepared-statement,sha256,varbinary,Php,Prepared Statement,Sha256,Varbinary,当使用哈希密码时,我无法从数据库中提取数据。我使用hash_hmac/sha256如下: function get_password_hash($password){ return hash_hmac('sha256',$password,'xxxxxxx',false); } $p是非散列密码;通过将其存储在我的数据库中,以下功能可以完美运行: $loginQuery = $dbc->prepare("SELECT id, username FROM users WHERE (emai

当使用哈希密码时,我无法从数据库中提取数据。我使用hash_hmac/sha256如下:

function get_password_hash($password){
return hash_hmac('sha256',$password,'xxxxxxx',false);
}
$p
是非散列密码;通过将其存储在我的数据库中,以下功能可以完美运行:

$loginQuery = $dbc->prepare("SELECT id, username FROM users WHERE (email=? AND pass=?)");
$loginQuery->bind_param('ss',$e,$p);
$loginQuery->execute();
$loginQuery->bind_result($id,$username);

while($loginQuery->fetch()){
$_SESSION['user_id'] = $id;
$_SESSION['username'] = $username;
} 
如果我将数据库更新为保存哈希密码,并将上述内容更新为以下内容,则SQL语句不会从数据库中返回任何内容

$pas = get_password_hash($p);
$loginQuery = $dbc->prepare("SELECT id, username FROM users WHERE (email=? AND pass=?)");
$loginQuery->bind_param('ss',$e,$pas);
$loginQuery->execute();
$loginQuery->bind_result($id,$username);

while($loginQuery->fetch()){
$_SESSION['user_id'] = $id;
$_SESSION['username'] = $username;
} 
我理解这是因为数据库记录在varbinary字段中保存哈希密码,但在我的SQL查询中,我使用的是字符串

我可以在准备好的语句中使用的参数类型选项有String、Blob、Double和Integer;以下哪项与我的数据库中的varbinary字段有关


我看到一篇类似的帖子,建议使用
pack()
将字符串转换为二进制;这在这里是如何工作的?

首先,不要使用
mysqli\u real\u escape\u字符串和参数绑定。要么是要么,决不能两者都是。其次,输出
$pas
变量以确认它与数据库中的哈希值相同。您可能应该在hmac中使用
false
来获得字符串结果,并使用它而不是二进制编码(当您同时使用
mysqli\u real\u escape\u字符串和参数绑定时,这确实会中断)我删除了任何mysqli\u real\u escape\u字符串,在我的hmac中使用false,并使用下面的方法测试了db哈希和$pas。仍然没有从数据库返回任何内容。为什么您坚持将密码存储在VARBINARY字段中?当您调用
hash\u hmac时()
第四个参数设置为
false
时,它将返回常规字符串,而不是二进制字符串。