Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果我从数据库获取哈希值,password\u verify将返回false;如果我复制并粘贴哈希值,password\u verify将返回true_Php_Mysql_Pdo_Hash_Bcrypt - Fatal编程技术网

Php 如果我从数据库获取哈希值,password\u verify将返回false;如果我复制并粘贴哈希值,password\u verify将返回true

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,

所以在把密码放进我的数据库之后 (列密码类型为二进制(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, 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
因此,当您从数据库检索密码时,实际上收到的是长度为255的字符串(这就是为什么我在中要求
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"