bcryptjs compare方法异常:哈希后立即校验仍始终返回false
bcryptjs.compare返回false的原因及修复方案
核心失败原因
跨库混用导致不兼容
你提到使用bcryptjs.compare做验证,但代码中却用bcrypt.hash生成哈希值。bcrypt和bcryptjs虽同属bcrypt算法实现,但底层细节存在差异,用其中一个库生成的哈希值,无法被另一个库正确验证,必然返回false。冗余的密码复制逻辑可能引发意外
代码中(' ' + 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.
相关产品推荐
相关产品推荐

