PHPpassword_hash()、password_verify()
在您的注册脚本中,您使用password_hash()正确地散列密码并将其存储在数据库。但是,在登录期间使用password_verify()验证密码时,您遇到不匹配的情况。
您提供的代码片段显示存储在数据库中的密码经过哈希处理(以“$2y$10$”开头) ,而用户输入的密码是纯文本形式(string(1) "1")。问题在于您从数据库检索密码的方式。
在登录脚本中,您直接从数据库结果中检索密码列,而不进行任何进一步处理。然而,存储的密码是经过哈希处理的,需要先对其进行未哈希处理,然后才能与用户使用password_verify()输入的纯文本密码进行比较。
解决方案:
在登录脚本中,在使用password_verify()之前,您需要从数据库中检索存储的散列密码,然后使用password_hash()函数和PASSWORD_DEFAULT算法对其进行反散列。以下是登录脚本的更正代码:
<code class="php">// ...same code as before... $stored_hash = $row['password']; // Retrieve the stored hashed password if (password_verify($pwd, $stored_hash)) { // ...same code as before... }</code>
此修改可确保存储在数据库中的密码在与用户输入的纯文本密码进行比较之前正确地进行未哈希处理,从而允许 password_verify() 运行正确。
以上是为什么 PHP 密码验证因密码哈希不匹配而失败?的详细内容。更多信息请关注PHP中文网其他相关文章!