2009-10-08 9 views
1

Existe-t-il un C# équivalent à Java DigestUtils .md5Hex (String)? Mon Java est rouillé, mais je peux dire que DigestUtils fait partie du paquet Apache Commons Codec, et que la méthode md5Hex (String) utilise essentiellement MessageDigest.getInstance ("MD5").C# équivalent à DigestUtils.md5Hex de Java (chaîne)?

(une friandise liée, à la fois le code Java et C# utilisent UTF8.)


Dans le plus simple des essais, j'ai écarté toute différence entre les algorithmes Java et C# j'utilise. Cela signifie que mon problème est ailleurs. Mais, pour l'enregistrement, ces deux morceau de code générer des résultats identiques:

Java (Merci, Alex.):

private static void printMd5Hex(String data) { 
    System.out.println(DigestUtils.md5Hex(data)); 
} 

C#:

private static void printMd5Hex(string data) 
{ 
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
    byte[] dataHash = md5.ComputeHash(Encoding.UTF8.GetBytes(data)); 
    StringBuilder sb = new StringBuilder(); 
    foreach (byte b in dataHash) 
    { 
     sb.Append(b.ToString("x2").ToLower()); 
    } 
    Console.WriteLine(sb.ToString()); 
} 

Pour une bonne fermeture sur cette question, la racine de mon problème avait à voir avec un bug dans le code Java dans la chaîne de format utilisée pour créer les "données" en cours de hachage. En substance:

string dataFormatString = "%1$s, %2$s, %3$s, %4$s, %5$s, %6$s, %7$s, %8$s, %9$s, %10$s, %11$s, %12s"; 
string dataToHash = String.Format(dataFormatString, ...); 

Le problème est ce 12ème paramètre. Il manque un $, ce qui signifie que les données sont espacées de 12 caractères minimum, en utilisant le premier argument comme données à formater. Malheureusement, le dev qui a écrit l'insecte ne travaille plus ici, me privant ainsi de la chance d'enrouler mes mains autour de sa gorge.

Répondre

3

Voulez-vous calculer md5 en C#?

System.Security.Cryptography.MD5CryptoServiceProvider x = 
    new System.Security.Cryptography.MD5CryptoServiceProvider(); 
byte[] bs = System.Text.Encoding.UTF8.GetBytes(password); 
bs = x.ComputeHash(bs); 
System.Text.StringBuilder s = new System.Text.StringBuilder(); 
foreach (byte b in bs) 
{ 
    s.Append(b.ToString("x2").ToLower()); 
} 
password = s.ToString(); 
+0

Merci @Alex et/ou gigue. Je peux, et ai, calculé avec succès md5 en C#, en utilisant le hachage "System.Security.Cryptography.MD5" algorthim. Cependant, quelque chose à propos de la façon dont je tente de répliquer le comportement DigestUtils.md5Hex (String) n'aboutit pas au même hachage. Je vais essayer. – JMD

+0

J'ai maintenant essayé la méthode ci-dessus, avec MD5CryptoServiceProvider.ComputeHash (byte []), et c'est avec émotion mélangée que je signale qu'elle génère exactement le même hachage que mon code existant. Malheureusement, il ne correspond pas à la sortie de DigestUtils.md5hex (String). – JMD

+0

Cet exemple calcule md5 sur le codage UTF8 de chaîne. Peut-être devez-vous utiliser Unicode? –