如何将SHA-256哈希值进行十六进制编码

5
在C#中如何正确地进行SHA-256哈希的十六进制编码?
private static string ToHex(byte[] bytes, bool upperCase)
{
    StringBuilder result = new StringBuilder(bytes.Length * 2);

    for (int i = 0; i < bytes.Length; i++)
        result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));

    return result.ToString();
}

private string hashRequestBody(string reqBody)
{
    string hashString;
    using (var sha256 = SHA256Managed.Create())
    {
        var hash = sha256.ComputeHash(Encoding.Default.GetBytes(reqBody));
        hashString = ToHex(hash, false);
    }

    MessageBox.Show(hashString);
    return hashString;
}

我进行了此操作,但结果与我使用的银行沙箱不同。

测试数据:

{"CorporateID":"BCAAPI2016","SourceAccountNumber":"0201245680","TransactionID":"00000001","TransactionDate":"2017-09-13","ReferenceID":"refID","CurrencyCode":"IDR","Amount":"10000","BeneficiaryAccountNumber":"0201245681","Remark1":"转账测试","Remark2":"在线转账"}

银行沙箱结果:e9d06986c1ed6b063bf59aa873030013725c518631deef2b2147e614017c2141

我的结果:1c83acc42cf905ca8afba27ef0640c70ad2856a366b57c17cf16f2894327676e


ToHex() 看起来没问题,问题可能出在其他地方。你能展示一下测试数据吗? - Alex K.
你的结果对于该输入是正确的,你确定只使用哈希而不是像HMAC这样的东西吗? - Alex K.
2个回答

10

我看到了许多解决这个问题的方法,但您的代码是最优雅的。我稍微重构了它并测试了这个答案。我还得到了哈希值:

 

1c83acc42cf905ca8afba27ef0640c70ad2856a366b57c17cf16f2894327676e

在此查看工作示例:https://dotnetfiddle.net/QbsKTc

也许这个哈希值与银行的不同,因为您更改了JSON字符串以删除私人数据?

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

public class Program
{
    public static void Main()
    {
        Console.WriteLine(SHA256HexHashString("{\"CorporateID\":\"BCAAPI2016\",\"SourceAccountNumber\":\"0201245680\",\"TransactionID\":\"00000001\",\"TransactionDate\":\"2017-09-13\",\"ReferenceID\":\"refID\",\"CurrencyCode\":\"IDR\",\"Amount\":\"10000\",\"BeneficiaryAccountNumber\":\"0201245681\",\"Remark1\":\"Transfer Test\",\"Remark2\":\"Online Transfer\"}"));
    }

    private static string ToHex(byte[] bytes, bool upperCase)
    {
        StringBuilder result = new StringBuilder(bytes.Length * 2);
        for (int i = 0; i < bytes.Length; i++)
            result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));
        return result.ToString();
    }

    private static string SHA256HexHashString(string StringIn)
    {
        string hashString;
        using (var sha256 = SHA256Managed.Create())
        {
            var hash = sha256.ComputeHash(Encoding.Default.GetBytes(StringIn));
            hashString = ToHex(hash, false);
        }

        return hashString;
    }
}

0
更简单的解决方案
public string SHA256HexHashString(string input)
{
    using var sha256 = SHA256.Create();
    var bytes = Encoding.UTF8.GetBytes(input);
    var hash = sha256.ComputeHash(bytes);
    var hex = BitConverter.ToString(hash).Replace("-", "").ToLower();
    return hex;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接