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

Node.js API中BCrypt密码比对始终返回false问题求助

BCrypt密码比对始终返回false的排查要点

以下是针对你代码问题的核心排查方向:

  • 数据库字段长度不足
    BCrypt生成的哈希值固定为60字符,若数据库password字段长度(如VARCHAR(50))小于60,会导致哈希值被截断,直接引发比对失败。立即检查并修改字段长度为VARCHAR(60)或更长。

  • 哈希存储时的完整性问题
    确认用户创建时的哈希逻辑正确:必须通过bcrypt.hash(原始密码, saltRounds, 回调)生成哈希值,且完整存入数据库。若存储过程中存在转义、添加额外字符(空格、换行)或字符集错误(非utf8mb4),都会破坏哈希值的完整性。

  • SQL注入风险导致的查询错误
    当前代码用字符串拼接构造SQL查询:select * from users where email = "${req.body.email}",若用户邮箱含特殊字符(如双引号),会导致查询结果异常,可能匹配到错误用户或无结果。必须改用参数化查询避免风险并保证查询准确性:

    let query = 'select * from users where email = ?';
    databaseConnector.query(query, [req.body.email], (error, result) => {
        // 原有逻辑
    });
    
  • 控制台输出验证
    查看console.warn(req.body.password, result[0].password)的输出,确认数据库取出的哈希值与用户创建时生成的哈希值完全一致。若存在截断或差异,定位存储/读取环节的问题。

  • 附带JWT Bug修正
    生成JWT时你写的是userID: result.id,但查询结果数组的第一个元素才是用户对象,应改为userID: result[0].id,避免生成无效JWT。

内容的提问来源于stack exchange,提问作者avi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:00:28