You need to enable JavaScript to run this app. 如何将整数转换为SHA384?JavaScript与C#实现结果不一致求助
优惠活动
大模型
产品
解决方案
定价
更多

如何将整数转换为SHA384?JavaScript与C#实现结果不一致求助

跨语言SHA384哈希结果不一致的原因及修正方法

核心差异来源

两个端计算的哈希输入字节流完全不同,是结果不匹配的根本原因:

  • C#端的计算逻辑:
    1. 将整数2转为字符串"2"
    2. 用UTF8编码把字符串转成单字节序列0x32(即字符'2'对应的ASCII编码值)
    3. 对该单字节序列计算SHA384,得到的结果是*文本"2"*的标准哈希值
  • CryptoJS端的原代码逻辑:
    1. 直接将整数2作为入参传入CryptoJS.SHA384()
    2. CryptoJS会对非字符串类型的入参做隐式类型转换,具体是把数字2转为字符编码值为2的控制字符(对应字节0x02),和C#端用来计算的0x32字节完全不同,自然无法得到一致结果

对齐结果的修正方案

要让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计算,同样不能依赖隐式转换

内容的提问来源于stack exchange,提问作者Muhammad Ehsan Shaikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 07:36:04