You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Postman中的JS SHA512哈希代码转换为C# .NET6实现?

问题分析

你的C#代码和原Postman JavaScript代码存在几个关键差异,导致结果不一致:

  • 原JS代码使用无密钥的SHA512哈希算法,但你用了带密钥的HMACSHA256
  • 原JS输出的是十六进制字符串,但你转换成了Base64格式
  • 缺少将请求对象序列化为JSON字符串的步骤(对应JS的Json.stringify)
正确的C# .NET 6实现

以下是与原Postman代码逻辑完全匹配的实现:

using System.Security.Cryptography;
using System.Text;
using System.Text.Json;

public string ComputeContentHash(object requestBody)
{
    // 1. 将请求体序列化为JSON字符串(模拟Json.stringify行为)
    // 可根据需要调整序列化选项,确保和JS侧一致
    var jsonOptions = new JsonSerializerOptions
    {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 对应JS默认的驼峰命名
        WriteIndented = false // 不缩进,和Json.stringify默认一致
    };
    string jsonString = JsonSerializer.Serialize(requestBody, jsonOptions);

    // 2. 将JSON字符串转换为UTF-8字节数组
    byte[] messageBytes = Encoding.UTF8.GetBytes(jsonString);

    // 3. 计算SHA512哈希
    using SHA512 sha512 = SHA512.Create();
    byte[] hashBytes = sha512.ComputeHash(messageBytes);

    // 4. 将哈希字节数组转换为十六进制字符串
    StringBuilder hexString = new StringBuilder();
    foreach (byte b in hashBytes)
    {
        hexString.Append(b.ToString("x2")); // x2表示两位小写十六进制,大写用X2
    }

    return hexString.ToString();
}
关键细节说明
  1. JSON序列化一致性:

    • 如果你的requestBody在JS侧是驼峰命名,C#中要配置JsonNamingPolicy.CamelCase确保序列化后的字段名一致
    • WriteIndented = false对应Json.stringify默认的无缩进格式,避免因空格差异导致哈希结果不同
  2. 哈希算法选择:

    • 使用SHA512.Create()创建无密钥的SHA512实例,和CryptoJS.SHA512的逻辑完全匹配
  3. 十六进制转换:

    • 用b.ToString("x2")确保每个字节转换为两位十六进制字符,和CryptoJS.enc.Hex的输出格式一致

内容的提问来源于stack exchange,提问作者EllisK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:50:37