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.
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);
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.
Vous pouvez utiliser Convert.ToBase64String
et Convert.FromBase64String
pour convertir facilement des tableaux d'octets en chaînes.
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
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.
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);
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.