前端用 CryptoJS 做 SHA256 摘要为什么结果和后端不一致?
我在登录时需要对密码做 SHA256 消息摘要再传给后端,但加密后的值老是对不上。后端说是 hex 编码,我也用了 hex,可结果就是不一样。
我用的是 CryptoJS,代码大概这样:
const hash = CryptoJS.SHA256('123456').toString(CryptoJS.enc.Hex);
console.log(hash);
后端用 Python 的 hashlib.sha256(b'123456').hexdigest() 得到的是 e7d80ffe9a10cda8f5e3a7b1e6c8e9a0...(省略),但我前端输出的却是小写但内容不同的字符串。是不是哪里编码搞错了?
首先你得明确一件事:CryptoJS 处理字符串时会先转换成 UTF-8 编码的字节数组。而 Python 直接把字符串转成字节时,默认用的是 ASCII 编码。
所以这里有两个地方要注意:
1. 你在 CryptoJS 里要显式指定编码方式
2. 确保两边输入的数据格式完全一致
下面是正确的写法:
其实问题的关键就在于这个
parse步骤。很多人直接传字符串进去,忽略了编码细节。CryptoJS 文档虽然有提到,但真容易被忽略。再啰嗦一句,开发加密相关的东西真要小心,稍微一个细节没注意,结果就完全不一样。我也在这上面踩过坑,调试半天才发现是编码的问题。希望这能帮到你。