La conversión de una matriz de bytes hash MD5 de una cadena
-
19-09-2019 - |
Pregunta
¿Cómo puedo convertir el resultado hash, que es una matriz de bytes, a una cadena?
byte[] bytePassword = Encoding.UTF8.GetBytes(password);
using (MD5 md5 = MD5.Create())
{
byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
}
Necesito convertir byteHashedPassword
en una cadena.
Solución
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();
}
A continuación, puede llamar como un método de extensión:
string hexString = byteArray.ToHex(false);
Otros consejos
Siempre me pareció que este es el más conveniente:
string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-","");
Por alguna extraña razón BitConverter le gusta poner guiones entre los bytes, por lo que la reemplazan simplemente los elimina.
Actualización: Si prefiere hexagonal "minúscula", acaba de hacer una .ToLower () y la pluma.
Ten en cuenta que si usted está haciendo esto como un bucle estrecho y muchos ops esto podría ser costoso, ya que hay al menos dos cuerdas implícita yesos y redimensiona pasando.
Puede utilizar Convert.ToBase64String
y Convert.FromBase64String
para convertir fácilmente matrices de bytes en cadenas.
Si usted está en el campo de 'preferencia Hex' se puede hacer esto. Esto es básicamente una versión mínima de la respuesta de Philippe Leybaert.
string.Concat(hash.Select(x => x.ToString("X2")))
B1DB2CC0BAEE67EA47CFAEDBF2D747DF
Bueno, ya que es un hash, que tiene, posiblemente, valores que no se pueden mostrar en una cadena normal, por lo que la mejor apuesta es para convertirlo en Base64 cadena codificada.
string s = Convert.ToBase64String(bytes);
y utilizar
byte[] bytes = Convert.FromBase64(s);
para obtener los bytes espalda.
Bueno, se podría utilizar el constructor cadena que lleva bytes y una codificación, pero lo más probable es obtener una difícil de manejar cadena de que, dado que podría contener un montón de divertidos personajes (bytes nulos, saltos de línea, caracteres de control, etc. )
La mejor manera de hacer esto sería para codificarla con la base 64 para conseguir una bonita cadena que es fácil trabajar con él:
string s = Convert.ToBase64String(bytes);
Y para pasar de esa cadena de nuevo a una matriz de bytes:
byte[] bytes = Convert.FromBase64String(s);
Para cualquier persona interesada un paquete Nuget que creó llamado CryptoStringify permite convertir una cadena a una cadena hash usando un buen sintaxis limpia, sin tener que jugar un poco con las matrices de bytes:
using (MD5 md5 = MD5.Create())
{
string strHashedPassword = md5.Hash(password);
}
Se trata de un método de extensión en HashAlgorithm
y KeyedHashAlgorithm
por lo que funciona en SHA1, HMACSHA1, SHA256, etc también.