簡體   English   中英

將 Java 代碼散列到 C# 中的等價物是什么?

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

我在從 C# 代碼轉換成 Java 獲取等效哈希碼時遇到一個奇怪的問題。 我不知道 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()));
}

解決方案是放置第一個密鑰並將其與有效負載數據連接起來。

我有完全相同的問題。 自從您問起已經兩年了,但以防萬一有人遇到這個問題,這是解決方案

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();
        }
    }

Encoding.Unicode (您在 C# ToJsonStream方法中使用)不是 UTF8。 這是UTF16。 請參閱MSDN (還要記住,UTF16 可以是小端或大端。)您正在尋找Encoding.UTF8

首先要做的是檢查您正在散列的字節數組是否相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM