You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于密码加密的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:56:53