我在 PHP 中遇到密码散列问题。我使用password_hash() 函数在注册期间对管理员密码进行哈希处理并将其存储在数据库中。但是,当我在登录期间尝试使用 password_verify() 验证密码时,它总是返回 false,即使我确定密码是正确的。
这是我的代码摘要:
$adminPassword = "test123";
$adminPasswordHash = password_hash($adminPassword, PASSWORD_BCRYPT);
// ... Store $adminPasswordHash in the database ...
// During login:
$adminInputPassword = "test123";
$adminPasswordHashVERIFY = "$2y$10$o4qspRTirOSdyGtwHCxt6ee2i0BNChl3mEPazxVbmb534kw3ACHCm";
if (password_verify($adminInputPassword, $adminPasswordHashVERIFY)) {
echo "Password is correct!";
} else {
echo "Password is incorrect!";
}
我已确保 $adminPassword 和 $adminInputPassword 具有相同的值,但验证始终返回 false。我还尝试使用 password_hash() 函数与 PASSWORD_DEFAULT 而不是 PASSWORD_BCRYPT,但结果是相同的。
我在哈希生成或验证过程中是否遗漏了某些内容?对此问题的任何帮助或见解将不胜感激。谢谢!
我发现问题了!该问题似乎是由于在 $adminPasswordHashVERIFY 变量中的哈希密码周围使用双引号 (") 引起的。使用双引号时,PHP 会解释该字符串并替换其中的变量。由于没有名为 $fReIQ 的变量,PHP 会对其进行处理作为未定义的变量,导致验证的哈希值不正确。
要解决此问题,请在 $adminPasswordHashVERIFY 变量中的哈希密码周围使用单引号 (')。这确保哈希被视为纯字符串并且不会被 PHP 解释。
现在,如果您尝试以下代码,您将得到输出“密码正确!”;
<?php
$adminPassword = "test123";
$adminPasswordHash = password_hash($adminPassword, PASSWORD_BCRYPT);
$adminInputPassword = "test123";
$adminPasswordHashVERIFY = '$2y$10$o4qspRTirOSdyGtwHCxt6ee2i0BNChl3mEPazxVbmb534kw3ACHCm';
if (password_verify($adminInputPassword, $adminPasswordHashVERIFY)) {
echo "Password is correct!";
} else {
echo "Password is incorrect!";
}
?>