将 Java 代码散列到 C# 中相当于什么?

What is the equivalent of hashing Java code into C#?

我在从翻译成 Java 的 C# 代码中获取等效哈希码时遇到了一个奇怪的问题。我不知道,MessageDigest 更新方法是做什么的。它应该只更新摘要的内容并且应该在调用摘要后计算散列。

我在 C# 中用 SHAManaged512.ComputeHash(content) 做同样的事情。但我没有得到相同的哈希码。

以下是Java代码。

public static String hash(String body, String secret) {
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-512");
        md.update(body.getBytes("UTF-8"));

        byte[] bytes = md.digest(secret.getBytes("UTF-8")); 

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
        }

        return sb.toString();
    } catch (Exception e) {
        throw new RuntimeException();
    }
}

以下为C#代码

private byte[] ComputeContentHash(string contentBody)
{               
        using (var shaM = new SHA512Managed())       
        {
            var content = string.Concat(contentBody, Options.SecretKey);

            var hashedValue = shaM.ComputeHash(ToJsonStream(content));
            return hashedValue;
        }
}

public static Stream ToJsonStream(object obj)
{
   return new MemoryStream(Encoding.Unicode.GetBytes(obj.ToString()));
}

Encoding.Unicode(您在 C# ToJsonStream 方法中使用的)不是 UTF8。这是UTF16。参见 MSDN。 (另请记住,UTF16 可以是小端或大端。)您正在寻找 Encoding.UTF8.

首先要做的是检查您正在散列的字节数组是否相同。

解决方案是首先放入密钥并将其与负载数据连接。

我遇到了完全相同的问题。自您问起已经两年了,但以防万一有人遇到这个问题,这里是解决方案

public static string encryptHash(string APIkey, string RequestBodyJson)
    {
        var secretBytes = Encoding.UTF8.GetBytes(APIkey);
        var saltBytes = Encoding.UTF8.GetBytes(RequestBodyJson);

        using (var sHA256 = new SHA256Managed())
        {
            byte[] bytes = sHA256.ComputeHash(saltBytes.Concat(secretBytes).ToArray());

            //convert to hex
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < bytes.Length; i++)
            {
                builder.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
            }
            return builder.ToString();
        }
    }