如何将整数转换为SHA384?JavaScript与C#实现结果不一致求助
跨语言SHA384哈希结果不一致的原因及修正方法
核心差异来源
两个端计算的哈希输入字节流完全不同,是结果不匹配的根本原因:
- C#端的计算逻辑:
- 将整数2转为字符串
"2" - 用UTF8编码把字符串转成单字节序列
0x32(即字符'2'对应的ASCII编码值) - 对该单字节序列计算SHA384,得到的结果是*文本"2"*的标准哈希值
- 将整数2转为字符串
- CryptoJS端的原代码逻辑:
- 直接将整数2作为入参传入
CryptoJS.SHA384() - CryptoJS会对非字符串类型的入参做隐式类型转换,具体是把数字2转为字符编码值为2的控制字符(对应字节
0x02),和C#端用来计算的0x32字节完全不同,自然无法得到一致结果
- 直接将整数2作为入参传入
对齐结果的修正方案
要让JS端输出和C#完全一致的哈希值,需要在JS代码中显式复刻C#的输入转换逻辑,消除隐式转换的干扰:
const inputNumber = 2; // 显式将整数转为十进制字符串,和C#的ToString()逻辑对齐 const inputText = inputNumber.toString(); const hashResult = CryptoJS.SHA384(inputText).toString(); console.log(hashResult);
运行上述代码的输出会和C#端完全一致:d063457705d66d6f016e4cdd747db3af8d70ebfd36badd63de6c8ca4a9d8bfb5d874e7fbd750aa804dcaddae7eeef51e
通用对齐注意事项
- 跨语言实现哈希时,核心校验标准是两端传入哈希算法的原始字节序列完全一致,不要依赖任意语言或加密库的隐式类型转换规则,所有类型转字节的步骤都要显式实现
- 如果实际需求是对整数本身的二进制表示(而非整数转成的文本)计算哈希,需要同时调整两端逻辑:
- C#端移除整数转字符串、编码的步骤,直接用
BitConverter.GetBytes(输入整数)拿到整数的原生字节序列传入哈希计算 - JS端按照相同的字节序、数据长度,把整数手动转换为对应的字节数组后再传入CryptoJS计算,同样不能依赖隐式转换
- C#端移除整数转字符串、编码的步骤,直接用
内容的提问来源于stack exchange,提问作者Muhammad Ehsan Shaikh
相关产品推荐
相关产品推荐

