我想用用户插入的输入验证我存储的哈希密码。
理论上说。。。
在阅读了password_hash和password_verify的机制后,我意识到,理论上,插入的字符串将与哈希进行比较,至少在我的情况下,哈希存储在站点数据库中。
发生在我身上的事…
我使用password_hash注册用户,然后使用password_verify验证登录名。如果我很好,并且代码是正确的,那么这个函数应该用存储的哈希验证用户的输入(即使是纯文本(?))。
让我们看看代码:
注册代码:
$passwordHash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 12));
注意:还有更多的代码,但我想这是最重要的部分,所以我决定只粘贴这部分。
登录代码:
<?php
//controller!
require "../model/backend.php";
$username = $_POST['user'];
$password = $_POST['password'];
$dbcom = new dbInteraction;
$dbcom->admlog($username, $password);
$dbcom->conclose();
?>
验证码:
$this->username = $username;
$this->password = $password;
//$this->pdo = $pdo;
//$adm = 1;
$myquery = 'SELECT username, password, isadmin FROM users WHERE username = :username';// AND password = :password';
$stmt = $this->pdo->prepare($myquery);
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if($user === false){
die('1Incorrect username / password combination!');
} else{
//Compare the passwords.
$dbpass = $user['password'];
echo $dbpass;
echo '<br>bd<br>input<br>';
echo $password;
$validPassword = password_verify($dbpass, $password);
echo '<br>debug <br>';
echo 'pre pass:<br>';
echo $validPassword;
if($validPassword){
//Provide the user with a login session.
$_SESSION['user_id'] = $user['username'];
$_SESSION['logged_in'] = time();
//header('Location: home.php');
exit;
}else{
die('<br>no pass--Incorrect username / password combination!');
}
}
我的代码中是否有一些理论基础问题,或者只是编码不好?我还在努力实现。
非常感谢。
问题出在password_verify参数的顺序上。
它应该像$validPassword = password_verify($password, $dbpass);
或者用一般的话来说:$validPassword = password_verify('String to verify', 'Saved password');
特别感谢@JonStirling