这个问题在这里已经有答案了:
如何使用php的密码\u散列来散列和验证密码(7个答案)
9个月前关门了。
我有一个密码被散列并保存到sql数据库中,代码如下:
$passHash = password_hash($password, PASSWORD_DEFAULT);
它保存在一个名为“password”的字段中,类型为varchar(255)
然后使用以下代码登录用户
$dbconn = OpenCon();
$username = $_POST['usernameInput'];
$password = $_POST['passInput'];
$passHash = password_hash($password, PASSWORD_DEFAULT);
$school = $_POST['schoolInput'];
$sqlstmnt2 = 'SELECT * FROM users WHERE username = :username AND school = :school';
$stmtUsr2 = $dbconn -> prepare($sqlstmnt2);
$stmtUsr2 -> bindValue(':username', $username);
$stmtUsr2 -> bindValue(':school', $school);
$stmtUsr2 -> execute();
$rows = $stmtUsr2 -> fetchAll();
$n = count($rows);
if($n<1 or !password_verify($rows[0]['password'], $passhash)) {
echo 'No user account exists. Please check your credentials'."<br>";
}
else{
$_SESSION['username'] = $username;
header("Location: home.php");
}
当我运行它并输入一个我知道是正确的详细信息时,password\u verify函数并没有返回它们是相同的。我做错什么了?
1条答案
按热度按时间mzaanser1#
如果我们分解代码,看主流程而不看细节,就会得到如下结果:
(我假设
password
,它实际上并没有存储原始密码,这将破坏散列的目的!)但如果我们看看
password_verify
在php手册中,如下所示:您正在传入两个哈希值,但它需要一个密码(用户尝试登录的密码)和一个哈希值(存储的密码)。所以简化代码的正确版本是:
或者更简洁地说:
理解这一点的关键是函数不仅仅是比较两个字符串。它使用原始散列中存储的信息(包括一个随机的“salt”字符串)根据用户的输入重新计算一个新的散列。