【问题标题】:PHP password_hash not matching [duplicate]PHP密码哈希不匹配[重复]
【发布时间】:2020-07-25 17:47:05
【问题描述】:

我有一个密码被散列并使用以下代码保存到 SQL 数据库中:

$passHash = password_hash($password, PASSWORD_DEFAULT);

它被保存在一个名为“密码”的字段中,类型为 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_verify 函数不会返回它们是相同的。我做错了什么?

【问题讨论】:

  • PASSWORD_VERIFY() 来自手册 password_hash()/password_verify() 对的另一部分
  • 请查看使用示例。您不是在验证实际密码,而是在验证新的哈希值。如果password_hash() 总是会产生你不需要password_verify() 的相同哈希值,你可以简单地使用===
  • 啊,所以我看到我应该将 $password 传递给 password_verify 而不是实际的哈希值。我这样做并编辑了问题,但它仍然不接受它
  • password_verify($_POST['passInput'], $rows[0]['password'])
  • 我已恢复您的编辑并按照最初提出的问题回答了问题。

标签: php sql pdo


【解决方案1】:

如果我们分解代码,并查看没有细节的主要流程,我们会得到这样的结果:

$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_verifyin the PHP manual的签名,看起来是这样的:

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
}

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

【讨论】:

    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 2015-04-05
    • 2013-05-19
    • 2015-09-10
    • 2012-07-05
    • 2015-05-11
    • 2013-05-14
    • 2015-09-27
    相关资源
    最近更新 更多