2010-03-12 16 views
58

¿Cómo puedo convertir el resultado hash, que es una matriz de bytes, en una cadena?Conversión de una matriz de bytes hash md5 en una cadena

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

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

Necesito convertir byteHashedPassword en una cadena.

Respuesta

66
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); 
+0

¿Cuál es la importancia de la carcasa superior? – Blankman

+3

una cuestión de preferencia. Es por eso que agregué un parámetro a mi método, por lo que la persona que llama puede elegir –

+0

. Es la diferencia entre 'c0de' y' C0DE', eso es todo. –

22

Puede usar Convert.ToBase64String y Convert.FromBase64String para convertir fácilmente arrays de bytes en cadenas.

8

Bueno, ya que es un hash, que tiene, posiblemente, valores que no se pueden mostrar en una cadena normal, por lo que la mejor opción es convertirlo en una cadena codificada en Base64.

string s = Convert.ToBase64String(bytes); 

y utilizar

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

para obtener los bytes espalda.

2

Bueno, podrías usar el constructor de cadenas que toma bytes y una codificación, pero es probable que tengas una cadena difícil de manejar, ya que podría contener muchos personajes divertidos (bytes nulos, líneas nuevas, 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); 
53

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 el reemplazo simplemente los elimina.

Actualización: Si prefiere el hexadecimal "minúscula", simplemente haga un .ToLower() y un boom.

Tenga en cuenta que si está haciendo esto como un circuito cerrado y muchas operaciones, esto podría ser costoso, ya que hay al menos dos conversiones de cadenas implícitas y cambios de tamaño.

+0

hace lo mismo que la solución @PhilippeLeybaert, pero en una línea. – sonjz

12

Si estás en el campo 'Hex preference' puedes hacerlo. Esta es básicamente una versión mínima de la respuesta de Philippe Leybaert.

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

0

Para cualquier persona interesada un paquete Nuget creé llamada CryptoStringify le 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 modo funciona en SHA1, HMACSHA1, SHA256, etc también.

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

Cuestiones relacionadas