password_verify()无法在php中工作

时间:2017-02-01 11:39:51

标签: php mysql passwords php-password-hash

我使用password_hash创建了一个密码,如下所示:

$password = password_hash('password123', PASSWORD_DEFAULT);

它存储在带有varchar(60)的列的MySQL数据库中。

在我的登录表单中,我使用:

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?

3 个答案:

答案 0 :(得分:0)

设置数据库列值超过60,因为加密的密码字符可能超过100.而$ password = password_hash('password123',PASSWORD_DEFAULT);此函数返回每次都可能更改的加密密码。

答案 1 :(得分:0)

在php手册中对password_hash()函数有一个注意事项:使用PASSWORD_BCRYPT作为算法,将导致密码参数被截断为最大长度为72个字符。 请阅读此http://php.net/manual/en/function.password-hash.php

也许您需要将该mysql列从varchar(60)更改为varchar(73)或更大。你也可以使用类型文本。

答案 2 :(得分:0)

解决了我自己的问题。根据@martinstoeckli和@Narf的建议,我改变了调试方式,发现问题不在于password_verify(),而在于我处理输出的方式。很抱歉跑来跑去,感谢您的帮助。