我想用用户插入的输入来验证我存储的散列密码。
什么理论说......
在阅读了password_hash和password_verify的机制之后,我意识到理论上,插入的字符串将与哈希进行比较,至少在我的情况下,哈希存储在站点db中。
发生了什么......
我使用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!');
}
}
我的代码中是否存在一些理论基础问题,或者它的编码错误?我还在努力实现。
非常感谢。
答案 0 :(得分:1)
问题是按password_verify params的顺序。
应该像$validPassword = password_verify($password, $dbpass);
或者用通用的词语:
$validPassword = password_verify('String to verify', 'Saved password');
特别感谢@JonStirling