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

crypto-js加密解密后值与原值不一致问题排查

问题定位

解密后得到的313233343536373839是明文123456789的十六进制编码结果,问题出在crypto-js的API调用错误:
CryptoJS.AES.decrypt()解密完成后返回的是WordArray类型对象,直接无参调用.toString()默认会把结果转成十六进制字符串,不会自动输出原始的UTF-8明文,自然和输入的密码不匹配。

修复步骤
  1. 修正解密后的编码转换逻辑,显式指定UTF-8编码:
// 登录接口解密部分修改为
const password = CryptoJS.AES.decrypt(
  user.password,
  process.env.PASS_SEC
).toString(CryptoJS.enc.Utf8);

注意:CryptoJS.AES.decrypt是同步方法,前面不需要加await,属于冗余写法。

  1. 补全接口分支的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:21:40