基于密码加密的PHP安全登录系统密码验证失败求助
解决密码验证失败的问题
我帮你排查了代码和可能的问题,最可能导致密码验证失败的原因是数据库password字段长度不足,另外还有几个小细节需要调整:
1. 数据库字段长度问题(核心原因)
PASSWORD_BCRYPT生成的哈希值固定是60个字符。如果你的users表中password字段的长度设置小于60(比如VARCHAR(50)),存储时哈希会被自动截断,这就会导致password_verify完全无法匹配。
解决步骤:
- 修改数据库表结构,将
password字段改为VARCHAR(255)(推荐用255留足余量,至少要设置为60) - 重新注册测试用户(因为之前存储的截断哈希已经无法恢复,必须重新生成完整哈希)
2. 登录代码中的冗余代码
你在登录逻辑里写了这一行:
$password = $mysqli->escape_string(password_hash($_POST['password'], PASSWORD_BCRYPT));
这个变量完全没有被使用,虽然不会直接导致验证失败,但会增加代码混淆,建议直接删除。
3. 处理输入密码的前后空格
用户输入密码时可能不小心带了前后空格,而你的代码没有做处理。可以在注册和登录时都对密码做trim处理,避免这种情况:
注册页修改:
$password = $mysqli->escape_string(password_hash(trim($_POST['password']), PASSWORD_BCRYPT));
登录页修改:
if ( password_verify(trim($_POST['password']), $user['password']) ) {
4. 验证数据库中的哈希完整性
去数据库中查看对应用户的password字段值,确认它和你生成的示例哈希$2y$10$W3bOAG0BP/DExr/qpiT0ueVS3YHb2NVeSC3.oMAaVQbHlodJVudK.完全一致,没有被截断、添加空格或其他字符。
按照上面的步骤调整后,密码验证应该就能正常工作了!
内容的提问来源于stack exchange,提问作者Luciano Peña
相关产品推荐
相关产品推荐

