Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.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:密码验证不能与DB检索的哈希一起工作_Php_Authentication - Fatal编程技术网

PHP:密码验证不能与DB检索的哈希一起工作

PHP:密码验证不能与DB检索的哈希一起工作,php,authentication,Php,Authentication,我试图将密码与数据库中的哈希密码存储进行比较和输入。但是密码验证功能不起作用 以下是我对该表的查询: $sql = "CREATE TABLE IF NOT EXISTS users ( id_users INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, username VARCHAR(255) NOT NULL, user_password VARCHAR(255) NOT N

我试图将密码与数据库中的哈希密码存储进行比较和输入。但是密码验证功能不起作用

以下是我对该表的查询:

$sql = "CREATE TABLE IF NOT EXISTS users (
           id_users INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
           username VARCHAR(255) NOT NULL,
           user_password VARCHAR(255) NOT NULL
)";
$db->exec($sql);
下面是密码的哈希函数:

$sql = $db->prepare("INSERT INTO users (username, user_password) 
                    VALUES (:username, :user_password)");
$sql->bindParam(':username', $username);
$sql->bindParam(':user_password', password_hash($password, PASSWORD_DEFAULT));
$sql->execute();
最后,下面是我如何检索数据库的哈希密码以及如何验证:

#Récupération des données
$username= $_POST['username'];
$password= $_POST['mdp'];

#Connexion à la base de données
require_once 'inc/db.php';

#Vérification en BDD
$req = $db->prepare("SELECT user_password FROM users WHERE username = :username");
$req->execute([':username' => $username]);
$user = $req->fetch();
$pwd = $user->user_password;
        
if(password_verify($password, $pwd)){
     echo '<br>true';
}else{
     echo '<br>false';
}
但是,条件返回总是错误的。但是,当我这样做时,这是可行的:

$x = 'x';
$y = password_hash($x, PASSWORD_DEFAULT);
debug($y);
        
if(password_verify($x, $y)){
    echo '<br>true';
}else{
    echo '<br>false';
}
所以我假设问题来自于数据库中的存储


谢谢你的帮助:

不,所有变量都可以,我为每个变量都做了一个var_转储,输入密码是正确的,检索散列密码看起来也可以。它有60个字符长。如果错误报告不是你的事,请用var_转储替换密码验证。你没有将$pwd设置为任何值吗?$pwd内有什么?password\u verify的第二个参数必须是$user->userPassword。但是你在那里写了$pwd!?!因此,当我用var_dump替换password_verify时,它返回:string1 r string60$2y$10$AIoARRgHCDw9A7xGfKeBzuIxaOpXjs7qszUb9OhiZfaFLCIAyDfei,在$pwd中有:$2y$10$aioarrghcdw9a7xgfkebzuixaoxjs7qszub9ohizfaflciaydfei