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

为何bcrypt.compareSync()始终返回false?

解决bcrypt.compareSync始终返回false的问题
  • 先确认密码存储逻辑是否正确:你控制台看着两个密码一样,但bcrypt的compareSync是拿明文和哈希值比对,不是明文比明文。如果存进JSON的是明文密码,那肯定会返回false。去查用户创建代码,必须是用bcrypt.hashSync(明文密码, 10)(盐值选10左右就行)生成哈希字符串后再存进数据库的。

  • 排查不可见字符:控制台打印的内容看着一致,可能藏着空格、换行符这类看不见的字符。给打印的密码加引号就能显形:

    console.log(`"${req.body.password}"`);
    console.log(`"${users[i].password}"`);
    

    另外表单传来的密码可以先做个trim处理:req.body.password.trim(),防止用户输入时不小心带了前后空格。

  • 检查哈希值是否完整有效:JSON存储时如果不小心改了哈希字符串(比如多打了空格、转义出错),比对肯定失败。可以把控制台里的users[i].password复制出来,写个小脚本用bcrypt手动验证下:

    const bcrypt = require('bcrypt');
    const hash = '你复制的哈希值';
    const password = '表单输入的明文密码';
    console.log(bcrypt.compareSync(password, hash));
    

    如果这里返回false,说明哈希值本身就有问题。

  • 核对bcrypt版本:如果存储哈希时用的bcrypt版本和现在比对的版本差得远,可能出现兼容性问题。去看package.json里的bcrypt版本号,确保前后使用的是同一个版本。

内容的提问来源于stack exchange,提问作者Manuel Alejandro Garca Andrade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:15:57