为何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
相关产品推荐
相关产品推荐

