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.

¿Fue útil?

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.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top