web-dev-qa-db-fra.com

Conversion d'un tableau d'octets de hachage md5 en chaîne

Comment puis-je convertir le résultat haché, qui est un tableau d'octets, en chaîne?

byte[] bytePassword = Encoding.UTF8.GetBytes(password);

using (MD5 md5 = MD5.Create())
{
    byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
} 

J'ai besoin de convertir byteHashedPassword en chaîne. 

68
Blankman
   public static string ToHex(this byte[] bytes, bool upperCase)
    {
        StringBuilder result = new StringBuilder(bytes.Length*2);

        for (int i = 0; i < bytes.Length; i++)
            result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));

        return result.ToString();
    }

Vous pouvez ensuite l'appeler comme méthode d'extension:

string hexString = byteArray.ToHex(false);
74
Philippe Leybaert

J'ai toujours trouvé que c'était le plus pratique:

string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-","");

Pour une raison étrange, BitConverter aime mettre des tirets entre octets, le remplacement les supprime donc. 

Mise à jour: Si vous préférez l'hexagone "minuscule", faites simplement un .ToLower () et un boom.

Notez que si vous faites cela comme une boucle serrée et de nombreuses opérations, cela pourrait coûter cher car il y a au moins deux conversions et redimensionnements de chaîne implicites.

62
GrayWizardx

Vous pouvez utiliser Convert.ToBase64String et Convert.FromBase64String pour convertir facilement des tableaux d'octets en chaînes.

23
David

Si vous êtes dans le camp "Préférences Hex", vous pouvez le faire. Il s’agit d’une version minimale de la réponse de Philippe Leybaert. 

string.Concat(hash.Select(x => x.ToString("X2")))

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

17
Simon_Weaver

Comme il s’agit d’un hachage, il peut éventuellement contenir des valeurs qui ne peuvent pas être affichées dans une chaîne normale. Le mieux est donc de le convertir en chaîne encodée en Base64.

string s = Convert.ToBase64String(bytes);

et utilise 

byte[] bytes = Convert.FromBase64(s);

pour récupérer les octets.

8
AxelEckenberger

Vous pouvez utiliser le constructeur de chaîne qui prend des octets et un encodage, mais vous obtiendrez probablement une chaîne difficile à gérer car elle pourrait contenir de nombreux caractères amusants (octets nuls, nouvelles lignes, caractères de contrôle, etc.)

La meilleure façon de le faire serait de l'encoder avec la base 64 pour obtenir une chaîne agréable avec laquelle il est facile de travailler:

string s = Convert.ToBase64String(bytes);

Et pour revenir de cette chaîne à un tableau d'octets:

byte[] bytes = Convert.FromBase64String(s);
2
Eric Petroelje

Pour les personnes intéressées, le paquet Nuget que j'ai créé et appelé CryptoStringify vous permet de convertir une chaîne en chaîne hachée à l'aide d'une syntaxe propre, sans devoir jouer avec les tableaux d'octets:

using (MD5 md5 = MD5.Create())
{
    string strHashedPassword = md5.Hash(password);
}

C'est une méthode d'extension sur HashAlgorithm et KeyedHashAlgorithm donc fonctionne également sur SHA1, HMACSHA1, SHA256, etc.

https://www.nuget.org/packages/cryptostringify

0
garryp