2017-10-17 10 views
0

J'ai un problème étrange en obtenant le code de hachage équivalent du code de C# traduit en Java. Je ne sais pas, ce que fait la méthode de mise à jour de MessageDigest. Il devrait seulement mettre à jour le contenu de digest et devrait calculer le hachage après avoir appelé digest.Quel est l'équivalent du hachage du code Java en C#?

Même chose que je fais en C# avec SHAManaged512.ComputeHash (contenu). Mais je ne reçois pas le même code de hachage.

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

Après est de code 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())); 
} 

Répondre

-1

Encoding.Unicode (que vous utilisez dans la méthode C# ToJsonStream) n'est pas UTF8. C'est UTF16. Voir MSDN. (Gardez aussi à l'esprit que UTF16 peut être petit ou gros.) Vous recherchez Encoding.UTF8.

La première chose à faire est de vérifier si le tableau d'octets que vous avez créé est le même.

+0

Merci pour vos commentaires. Je l'ai fait moi-même. Le problème était d'ajouter au C# côté clé secrète d'abord, puis le contenu. – Usman

+0

@Usman Dans ce cas, vous pouvez accepter votre propre réponse. Quant à ma réponse, elle tient toujours. Je ne sais pas comment cela fonctionne pour vous car UTF8 est généralement différent de UTF16 et vous utilisez évidemment UTF8 en Java et UTF16 en C#. – ispiro

+0

@downvoter Soins pour expliquer pourquoi? – ispiro

0

La solution était de mettre la première clé secrète et de la concaténer avec les données de charge utile.