php密码\u哈希不匹配

u0sqgete  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(345)

这个问题在这里已经有答案了

如何使用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函数并没有返回它们是相同的。我做错什么了?

mzaanser

mzaanser1#

如果我们分解代码,看主流程而不看细节,就会得到如下结果:

$passwordFromUserInput = getPasswordFromUserInput(); // $password in your code
$passHash = password_hash($passwordFromUserInput, PASSWORD_DEFAULT);
$passwordHashFromDb = getPasswordHashFromDb(); // $rows[0]['password'] in your code
if ( password_verify($passwordHashFromDb, $passHash) ) {
   // success
}

(我假设 password ,它实际上并没有存储原始密码,这将破坏散列的目的!)
但如果我们看看 password_verify 在php手册中,如下所示:

password_verify ( string $password , string $hash )

您正在传入两个哈希值,但它需要一个密码(用户尝试登录的密码)和一个哈希值(存储的密码)。所以简化代码的正确版本是:

$passwordFromUserInput = getPasswordFromUserInput(); // $password in your code
$passwordHashFromDb = getPasswordHashFromDb(); // $rows[0]['password'] in your code
if ( password_verify($passwordFromUserInput, $passwordHashFromDb) ) {
   // success
}

或者更简洁地说:

if ( password_verify($_POST['passInput'], $rows[0]['password']) ) {
   // success
}

理解这一点的关键是函数不仅仅是比较两个字符串。它使用原始散列中存储的信息(包括一个随机的“salt”字符串)根据用户的输入重新计算一个新的散列。

相关问题