2017-10-17 8 views
0

Ich habe ein seltsames Problem, wenn ich äquivalenten Hash-Code aus C# -Code in Java übersetzt bekomme. Ich weiß nicht, was MessageDigest Update-Methode tun. Es sollte nur den Inhalt von Digest aktualisieren und nach dem Aufruf von Digest Hash berechnen.Was entspricht dem Hashing von Java-Code in C#?

Das gleiche mache ich in C# mit SHAManaged512.ComputeHash (Inhalt). Aber ich bekomme nicht den gleichen Hash-Code.

Folgendes ist der Java-Code.

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

Es folgt C# -Code

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

Antwort

-1

Encoding.Unicode (die Sie in der C# ToJsonStream Methode verwenden) ist nicht UTF8. Es ist UTF16. Siehe MSDN. (Denken Sie auch daran, dass UTF16 klein oder big endian sein kann.) Sie suchen nach Encoding.UTF8.

Als Erstes prüfen Sie, ob das Byte-Array, das Sie verwenden, identisch ist.

+0

Danke für Kommentare. Ich habe es alleine gemacht. Das Problem bestand darin, zuerst den C# -Seitenschlüssel und dann den Inhalt anzufügen. – Usman

+0

@Usman In diesem Fall können Sie Ihre eigene Antwort akzeptieren. Was meine Antwort betrifft, so gilt es immer noch. Ich weiß nicht, wie es für Sie funktioniert, da UTF8 im Allgemeinen anders ist als UTF16 und Sie offensichtlich UTF8 in Java und UTF16 in C# verwenden. – ispiro

+0

@ downvoter Vorsicht, warum? – ispiro

0

Die Lösung bestand darin, den ersten geheimen Schlüssel zu setzen und ihn mit Payload-Daten zu verknüpfen.