前端用 CryptoJS 做 SHA256 摘要为什么结果和后端不一致?

小晨旭 阅读 3

我在登录时需要对密码做 SHA256 消息摘要再传给后端,但加密后的值老是对不上。后端说是 hex 编码,我也用了 hex,可结果就是不一样。

我用的是 CryptoJS,代码大概这样:

const hash = CryptoJS.SHA256('123456').toString(CryptoJS.enc.Hex);
console.log(hash);

后端用 Python 的 hashlib.sha256(b'123456').hexdigest() 得到的是 e7d80ffe9a10cda8f5e3a7b1e6c8e9a0...(省略),但我前端输出的却是小写但内容不同的字符串。是不是哪里编码搞错了?

我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
熙研
熙研 Lv1
这个问题我遇到过,确实挺烦人。原理是这样,CryptoJS 默认处理字符串的方式和其他语言不太一样,特别是编码这块。

首先你得明确一件事:CryptoJS 处理字符串时会先转换成 UTF-8 编码的字节数组。而 Python 直接把字符串转成字节时,默认用的是 ASCII 编码。

所以这里有两个地方要注意:

1. 你在 CryptoJS 里要显式指定编码方式
2. 确保两边输入的数据格式完全一致

下面是正确的写法:

const password = '123456';
// 先转成 Utf8 字节数组
const wordArray = CryptoJS.enc.Utf8.parse(password);
// 再做 SHA256 哈希
const hash = CryptoJS.SHA256(wordArray);
// 最后转成 hex 格式输出
const hex = hash.toString(CryptoJS.enc.Hex);
console.log(hex); // 这下结果就对了


其实问题的关键就在于这个 parse 步骤。很多人直接传字符串进去,忽略了编码细节。CryptoJS 文档虽然有提到,但真容易被忽略。

再啰嗦一句,开发加密相关的东西真要小心,稍微一个细节没注意,结果就完全不一样。我也在这上面踩过坑,调试半天才发现是编码的问题。希望这能帮到你。
点赞
2026-03-27 22:00