Calculer un hachage MD5 à partir d’une chaîne

J’utilise le code C # suivant pour calculer un hachage MD5 à partir d’une chaîne. Cela fonctionne bien et génère une chaîne de caractères de 32 caractères comme ceci: 900150983cd24fb0d6963f7d28e17f72

 ssortingng sSourceData; byte[] tmpSource; byte[] tmpHash; sSourceData = "MySourceData"; //Create a byte array from source data. tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData); tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource); // and then convert tmpHash to ssortingng... 

Est-il possible d’utiliser un code comme celui-ci pour générer une chaîne hexadécimale de 16 caractères (ou une chaîne de 12 caractères)? Une chaîne de caractères de 32 caractères est bonne mais je pense que ce sera ennuyeux pour le client d’entrer le code!

Selon MSDN

Créer MD5:

  public static ssortingng CreateMD5(ssortingng input) { // Use input ssortingng to calculate MD5 hash using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create()) { byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input); byte[] hashBytes = md5.ComputeHash(inputBytes); // Convert the byte array to hexadecimal ssortingng SsortingngBuilder sb = new SsortingngBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("X2")); } return sb.ToString(); } } 
 // given, a password in a ssortingng ssortingng password = @"1234abcd"; // byte array representation of that ssortingng byte[] encodedPassword = new UTF8Encoding().GetBytes(password); // need MD5 to calculate the hash byte[] hash = ((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).ComputeHash(encodedPassword); // ssortingng representation (similar to UNIX format) ssortingng encoded = BitConverter.ToSsortingng(hash) // without dashes .Replace("-", ssortingng.Empty) // make lowercase .ToLower(); // encoded contains the hash you are wanting 

Tout dépend de ce que vous essayez de réaliser. Techniquement, vous pouvez simplement prendre les 12 premiers caractères du résultat du hachage MD5, mais la spécification de MD5 consiste à générer un caractère de 32 caractères.

La réduction de la taille du hachage réduit la sécurité et augmente les risques de collision et de bris du système.

Peut-être que si vous nous en dites plus sur ce que vous essayez de réaliser, nous pourrons peut-être vous aider davantage.

Vous pouvez utiliser Convert.ToBase64Ssortingng pour convertir une sortie de 16 octets de MD5 en une chaîne de ~ 24 caractères. Un peu mieux sans réduire la sécurité. ( j9JIbSY8HuT89/pwdC8jlw== pour votre exemple)

J’essayais de créer une représentation sous forme de chaîne du hachage MD5 à l’aide de LINQ. Cependant, aucune des solutions n’était des solutions LINQ, ce qui l’ajoutait à la gamme de solutions disponibles.

 ssortingng result; using (MD5 hash = MD5.Create()) { result = Ssortingng.Join ( "", from ba in hash.ComputeHash ( Encoding.UTF8.GetBytes(observedText) ) select ba.ToSsortingng("x2") ); } 

Un hash MD5 est de 128 bits, vous ne pouvez donc pas le représenter en hexadécimal avec moins de 32 caractères …

Je suppose qu’il est préférable d’utiliser le codage UTF-8 dans la chaîne MD5.

 public static ssortingng MD5(this ssortingng s) { using (var provider = System.Security.Cryptography.MD5.Create()) { SsortingngBuilder builder = new SsortingngBuilder(); foreach (byte b in provider.ComputeHash(Encoding.UTF8.GetBytes(s))) builder.Append(b.ToSsortingng("x2").ToLower()); return builder.ToSsortingng(); } } 
 System.Text.SsortingngBuilder hash = new System.Text.SsortingngBuilder(); System.Security.Cryptography.MD5CryptoServiceProvider md5provider = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] bytes = md5provider.ComputeHash(new System.Text.UTF8Encoding().GetBytes(YourEntrySsortingng)); for (int i = 0; i < bytes.Length; i++) { hash.Append(bytes[i].ToString("x2")); //lowerCase; X2 if uppercase desired } return hash.ToString(); 

Chaîne de support et stream de fichiers.

exemples

 ssortingng hashSsortingng = EasyMD5.Hash("My Ssortingng"); ssortingng hashFile = EasyMD5.Hash(System.IO.File.OpenRead("myFile.txt")); 

  class EasyMD5 { private static ssortingng GetMd5Hash(byte[] data) { SsortingngBuilder sBuilder = new SsortingngBuilder(); for (int i = 0; i < data.Length; i++) sBuilder.Append(data[i].ToString("x2")); return sBuilder.ToString(); } private static bool VerifyMd5Hash(byte[] data, string hash) { return 0 == StringComparer.OrdinalIgnoreCase.Compare(GetMd5Hash(data), hash); } public static string Hash(string data) { using (var md5 = MD5.Create()) return GetMd5Hash(md5.ComputeHash(Encoding.UTF8.GetBytes(data))); } public static string Hash(FileStream data) { using (var md5 = MD5.Create()) return GetMd5Hash(md5.ComputeHash(data)); } public static bool Verify(string data, string hash) { using (var md5 = MD5.Create()) return VerifyMd5Hash(md5.ComputeHash(Encoding.UTF8.GetBytes(data)), hash); } public static bool Verify(FileStream data, string hash) { using (var md5 = MD5.Create()) return VerifyMd5Hash(md5.ComputeHash(data), hash); } } 
 SsortingngBuilder sb= new SsortingngBuilder(); for (int i = 0; i < tmpHash.Length; i++) { sb.Append(tmpHash[i].ToString("x2")); }