crypto-js加密解密后值与原值不一致问题排查
问题定位
解密后得到的313233343536373839是明文123456789的十六进制编码结果,问题出在crypto-js的API调用错误:CryptoJS.AES.decrypt()解密完成后返回的是WordArray类型对象,直接无参调用.toString()默认会把结果转成十六进制字符串,不会自动输出原始的UTF-8明文,自然和输入的密码不匹配。
修复步骤
- 修正解密后的编码转换逻辑,显式指定UTF-8编码:
// 登录接口解密部分修改为 const password = CryptoJS.AES.decrypt( user.password, process.env.PASS_SEC ).toString(CryptoJS.enc.Utf8);
注意:CryptoJS.AES.decrypt是同步方法,前面不需要加await,属于冗余写法。
- 补全接口分支的
return语句,避免逻辑穿透报错:
原代码中用户不存在、密码错误两个分支发送响应后没有终止函数执行,会导致后续代码继续读取空对象属性报错,修改为:
const user = await User.findOne({ username: req.body.username }); if (!user) { return res.status(401).json("Incorrect Username"); } // 解密密码逻辑... if (password !== req.body.password) { return res.status(401).json("Incorrect Password"); } return res.status(200).json(user);
额外安全建议
- 对称加密存储密码存在密钥泄露后所有密码批量被破解的风险,生产环境建议改用
bcrypt、argon2这类带盐的单向哈希算法存储密码,不需要可逆解密,校验时直接比对哈希值即可。
内容的提问来源于stack exchange,提问作者jonlev03
相关产品推荐
相关产品推荐

