Vue中使用crypto-js的SHA256加密后,前后端哈希值不一致怎么办?
我在登录组件里用crypto-js给密码做SHA256摘要,但后端说计算结果和他们预期的不一样。明明双方都用的SHA256算法啊,哪里出问题了?
这是我写的Vue代码片段:
import CryptoJS from 'crypto-js'
export default {
data() {
return { password: '' }
},
methods: {
login() {
const hash = CryptoJS.SHA256(this.password).toString()
console.log('前端计算结果:', hash) // 输出:d29a71d0a96a...
// 发送hash到后端验证
}
}
}
后端Java同事说他们的正确结果应该是”a1b2c3d4…”,但我的输出完全不一样。试过把this.password先转成UTF-8再加密,但好像crypto-js默认就是用UTF-8处理的,这样改也没用。难道是编码方式不对吗?
MessageDigest直接 digest 字节数组,那他默认可能是用的平台编码(比如 GBK 或者 ISO-8859-1),这就导致了前后端的哈希不一致。你可以这样统一编码方式:明确在前端把字符串转成 Base64 或者 Hex 编码再传给后端,后端也要做对应的解码处理。
举个例子,在前端可以转成 Base64 发送:
然后告诉后端同事在 Java 端使用 Base64 解码后再做 SHA-256 digest。这样双方都按统一的格式处理,就不会出现编码差异的问题。
当然,更保险的做法是前后端都约定用 UTF-8 编码处理字符串,比如 Java 端显式用
getBytes(StandardCharsets.UTF_8),而前端可以优化成:总之,关键是确保输入到 SHA256 的字节流一致,问题就解决了。
如果还不行,就问后端是不是加了盐或者用了其他预处理。