Domanda

Come posso convertire il risultato hash, che è un array di byte, in una stringa?

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

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

Ho bisogno di convertire byteHashedPassword in una stringa.

È stato utile?

Soluzione

   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();
    }

È quindi possibile chiamare come un metodo di estensione:

string hexString = byteArray.ToHex(false);

Altri suggerimenti

Ho sempre trovato che questo è il più conveniente:

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

Per qualche strana ragione BitConverter piace mettere trattini tra i byte, in modo che il sostituire solo li rimuove.

Aggiornamento: Se si preferisce hex "minuscolo", basta fare un .ToLower () e del braccio.

Da notare che se si sta facendo questo come un loop stretto e molti ops questo potrebbe essere costoso in quanto ci sono almeno due stringa implicita getta e ridimensiona in corso.

È possibile utilizzare Convert.ToBase64String e Convert.FromBase64String per convertire facilmente array di byte in stringhe.

Se siete nel campo 'Hex preferenza' si può fare questo. Questo è fondamentalmente una versione minimale della risposta di Philippe Leybaert.

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

Beh, come si tratta di un hash, ha forse i valori che non possono essere visualizzati in una stringa normale, quindi la cosa migliore è di convertirlo in Base64 stringa codificata.

string s = Convert.ToBase64String(bytes);

e utilizzare

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

per ottenere i byte indietro.

Beh, si potrebbe utilizzare il costruttore stringa che prende byte e una codifica, ma è probabile ottenere un difficile da gestire stringa di fuori di quella in quanto potrebbe contenere un sacco di personaggi divertenti (byte nulli, a capo, caratteri di controllo, ecc )

Il modo migliore per farlo sarebbe quello di codificarlo con base 64 per ottenere una bella stringa che è facile da lavorare:

string s = Convert.ToBase64String(bytes);

E per andare da quella stringa di nuovo ad un array di byte:

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

Per chiunque sia interessato un pacchetto Nuget ho creato chiamato CryptoStringify permette di convertire una stringa in una stringa hash utilizzando un bel sintassi pulita, senza dover giocare con array di byte:

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

Si tratta di un metodo di estensione su HashAlgorithm e KeyedHashAlgorithm così funziona su SHA1, HMACSHA1, SHA256 ecc troppo.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top