bcrypt密码比对失败求助:注册哈希成功但登录比对失败
bcrypt密码比对失败问题排查与修复
1. 注册阶段核心逻辑错误
你的注册代码存在致命问题:哈希操作时用的是数据库中已有的user.password,而非用户输入的原始密码,这会导致存储的是「哈希后的哈希值」,登录时用原始密码自然无法匹配。
同时代码存在语法错误:setUser(user) { 多了多余的大括号,会导致代码执行异常,哈希过程可能未正确完成。
修正后的注册哈希部分代码:
getAllUsers().then((res) => { let user = res.data.find((u) => u.ugovor === ugovor); if (user) { setUser(user); // 修正语法错误,移除多余大括号 bcrypt.genSalt(10, (err, salt) => { // 使用用户输入的原始密码password进行哈希,而非user.password bcrypt.hash(password, salt, (err, hash) => { postUser(user.id, hash, password, email).then((res) => { user = res.data; setPassword(prev => [...prev, hash]); setEmail(prev => [...prev, user]); history("/login"); setError(""); console.log("uspesna registracija"); }) }) }) } else { setError("Не постоји купац са унесеним бројем Уговора и мерила"); return 0; } });
2. 验证数据库存储的哈希值合法性
注册完成后直接查看数据库中user.password字段:
- 正常bcrypt哈希值格式为
$2b$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,长度固定为60字符左右 - 若存储值不符合该格式,说明哈希过程未正确执行,或存储时被截断/篡改
3. 登录阶段逻辑顺序优化
原登录代码先执行密码比对,若用户不存在会直接报错,且比对失败后直接return,后续用户存在判断逻辑无法执行。应先判断用户是否存在,再做密码比对:
修正后的登录代码:
getAllUsers().then((res) => { let user = res.data.find((u) => u.ugovor === ugovor); if (!user) { setError("Broj Ugovora i lozinka se ne podudaraju"); return; } const doesPasswordMatch = bcrypt.compareSync(password, user.password); if (!doesPasswordMatch) { console.log('compare not success'); setError("Broj Ugovora i lozinka se ne podudaraju"); return; } // 比对成功后执行登录逻辑 console.log('compare success') setLogIn(true); setUser(user); history("/profile"); console.log("uspesno ulogovan"); });
4. 确认bcrypt版本一致性
确保前后端(若前端使用bcrypt)使用的bcrypt版本完全一致,不同版本的哈希算法存在兼容性差异,会导致比对失败。
内容的提问来源于stack exchange,提问作者Petar Ostojic
相关产品推荐
相关产品推荐

