Php 如果我从数据库获取哈希值,password\u verify将返回false;如果我复制并粘贴哈希值,password\u verify将返回true
所以在把密码放进我的数据库之后 (列密码类型为二进制(255)) 通过cmd我进入数据库,我可以看到密码是这个Php 如果我从数据库获取哈希值,password\u verify将返回false;如果我复制并粘贴哈希值,password\u verify将返回true,php,mysql,pdo,hash,bcrypt,Php,Mysql,Pdo,Hash,Bcrypt,所以在把密码放进我的数据库之后 (列密码类型为二进制(255)) 通过cmd我进入数据库,我可以看到密码是这个 $2y$10$nDzlRwWfC9sTvVqv5f7G1eByHethRHjEWGwBOjkpoaq3y2Fb.LCC. 现在,当用户登录时,我成功地从数据库中检索到了他的密码 //let's say his username is on $username and password in $password $con = new PDO( DB_DSN, DB_USERNAME,
$2y$10$nDzlRwWfC9sTvVqv5f7G1eByHethRHjEWGwBOjkpoaq3y2Fb.LCC.
现在,当用户登录时,我成功地从数据库中检索到了他的密码
//let's say his username is on $username and password in $password
$con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "SELECT password FROM users WHERE username = :usr LIMIT 1";
$stmt = $con->prepare( $sql );
$stmt->bindValue( "usr", $username, PDO::PARAM_STR );
$stmt->execute();
$result = $stmt->fetch();
$psw_from_db = $result["password"]; //checked with echo and it's correct
如果我这样做
password\u verify($password,$psw\u来自\u db)代码>
它将返回false,尽管我从_db检查了$password和$psw_
它们里面有正确的值
如果我直接从数据库中复制密码,并将其放置在数据库中,而不是从数据库中复制$psw_,它将返回true
password_verify($password ,'$2y$10$nDzlRwWfC9sTvVqv5f7G1eByHethRHjEWGwBOjkpoaq3y2Fb.LCC.');
//'' have to be used, it won't work with ""
我现在正在搜索几个小时,但尚未找到解决方案。根据的文档,您得到的响应似乎正确地填充了\0
(空字符):
当存储二进制
值时,这些值将用pad右键填充
值设置为指定的长度。焊盘值为0x00(零
字节)。值在插入时用0x00
右键填充,没有尾随
在选择时删除字节。所有字节在比较中都是重要的,
包括按顺序和不同的操作<代码>0x00
字节和空格
在比较中是不同的,使用0x00
var\u dump
,而不是echo
)。在本地测试一些值时,我收到如下信息:
string(255) "$2y$10$L5C66A5xFvf1YYAoWbnQDuRyveVOrnz1jfV/Eb0kT9UkZlWzCfK8a"
string(255) "$2y$10$EAkfkh8S1m66FWAX/KZYMeuhteDREL5B22cgLP0feKZ9.ydMgcgpa"
string(255) "$2y$10$Ll/272JbvIilDj74FAqVIeckWUGezqT926Z1LkVBZZSVwTaFUGOLe"
string(255) "$2y$10$fxvZv2ya0RncOksp09vqjekIWNmdEX9fEUahU6puSe8HqGcY51re6"
string(255) "$2y$10$f1xDu3fFnqMw.MEa4.93Tu3ouhr3kmXXbe41oTyy8xGTKaRbafQ8G"
string(255) "$2y$10$YhjBmNFjL7a8lj1Soyvdhe9GpfQ7SsX.dfkI0keQ0IgrkKIfQQjpC"
您可以使用或将数据类型从
BINARY(255)
更改为BINARY(60)
或CHAR(60)BINARY
甚至CHAR(60)
与latin1
排序。(bcrypt散列为59-60字节)。当您从\u db执行$psw\u的var\u dump
时,是否得到正确的bcrypt散列?这是正确的答案。我var_将多个值转储到一个变量中,然后返回该变量以在javascript中向其发出警报,但是来自_db的psw_是最后一个变量,而不是显示额外的空格,只缺少最后一个“值”。
string(255) "$2y$10$L5C66A5xFvf1YYAoWbnQDuRyveVOrnz1jfV/Eb0kT9UkZlWzCfK8a"
string(255) "$2y$10$EAkfkh8S1m66FWAX/KZYMeuhteDREL5B22cgLP0feKZ9.ydMgcgpa"
string(255) "$2y$10$Ll/272JbvIilDj74FAqVIeckWUGezqT926Z1LkVBZZSVwTaFUGOLe"
string(255) "$2y$10$fxvZv2ya0RncOksp09vqjekIWNmdEX9fEUahU6puSe8HqGcY51re6"
string(255) "$2y$10$f1xDu3fFnqMw.MEa4.93Tu3ouhr3kmXXbe41oTyy8xGTKaRbafQ8G"
string(255) "$2y$10$YhjBmNFjL7a8lj1Soyvdhe9GpfQ7SsX.dfkI0keQ0IgrkKIfQQjpC"