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

bcryptjs compare方法异常:哈希后立即校验仍始终返回false

bcryptjs.compare返回false的原因及修复方案

核心失败原因

  1. 跨库混用导致不兼容
    你提到使用bcryptjs.compare做验证,但代码中却用bcrypt.hash生成哈希值。bcrypt和bcryptjs虽同属bcrypt算法实现,但底层细节存在差异,用其中一个库生成的哈希值,无法被另一个库正确验证,必然返回false。

  2. 冗余的密码复制逻辑可能引发意外
    代码中(' ' + this.password).slice(1)的写法完全多余,虽然理论上不会改变密码内容,但如果this.password是Mongoose文档中带有getter/setter的属性,这种字符串拼接操作可能意外改变密码的格式或类型,导致保存的哈希值与原始密码不匹配。

修复方案

  • 统一使用同一加密库:全程使用bcryptjs(或全程使用bcrypt),确保哈希生成与验证用的是同一个库。
  • 简化原始密码的保存逻辑:直接复制原始密码,避免不必要的字符串操作。

修改后的代码示例

userSchema.pre('save', async function(next){
    if(!this.isModified('password')){
        return next();
     } 
    
    const original = this.password;
    this.password = await bcryptjs.hash(this.password, 10);
    
    console.log(await bcryptjs.compare(original, this.password) + " trying online test")
    next();
})

内容的提问来源于stack exchange,提问作者Davion Williams Jr.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:35:30