【发布时间】:2017-06-18 03:30:35
【问题描述】:
我已经使用 password_hash 创建了一个密码,如下所示:
$password = password_hash('password123', PASSWORD_DEFAULT);
这存储在 MySQL 数据库中的 varchar(60) 列中。
在我的登录表单中,我使用:
if(password_verify($password, $foundUser->Password){
/*login*/
}
其中$password 是来自登录表单的明文输入,$foundUser->Password 是存储在数据库中的哈希值,但 password_verify() 函数始终返回 false。
我已经使用以下代码检查了我的输入:
echo "Password: {$password} <br>";
echo "Found password: ".$foundUser->Password."<br>";
哪个输出:
Password: password123
Found password: $2y$10$8.ICQHCyCPzS.xygPO4cfuHsHZb6Kuxynn8/uUHOU1.7gY.UhSIXa
所以我有理由相信我输入了正确的密码并从我的数据库中获取了正确的哈希值。
我查看了this question 中的链接以获取答案,但还没有成功。有谁知道为什么 password_verify() 返回 false?
【问题讨论】:
-
来自手册:“建议将结果存储在可以扩展超过 60 个字符的数据库列中(255 个字符是一个不错的选择)。”
-
请注意,
PASSWORD_DEFAULT旨在随着 PHP 中添加新的和更强大的算法而随时间变化。因此,使用此标识符的结果长度可能会随时间而变化。因此,建议将结果存储在可以扩展超过 60 个字符的数据库列中(255 个字符将是一个不错的选择)。 – 仅作为初学者...您是否检查过从数据库中获得的值是和password_hash制作的一模一样吗? -
... 目前虽然
PASSWORD_DEFAULT使用 BCrypt 但不是,所以它应该始终是 60 个字符的字符串。 -
@Alvaro Gonzalez 和@deceze 我刚刚通过使用
password_hash()生成一个新的散列来测试这一点,并将它作为纯文本直接复制粘贴到数据库中。当我回显它时,它会打印出与password_hash()生成的代码完全相同的代码。 -
你展示的小代码有语法错误,所以你肯定已经删除了很多......我猜问题出在你没有展示的部分。
标签: php mysql passwords php-password-hash