2010-03-12 22 views
58

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

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

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

Devo convertire byteHashedPassword in una stringa.

risposta

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

È quindi possibile chiamare come un metodo di estensione:

string hexString = byteArray.ToHex(false); 
+0

qual è il significato dell'involucro superiore? – Blankman

+3

una questione di preferenza. Ecco perché ho aggiunto un parametro al mio metodo, quindi il chiamante può scegliere –

+0

È la differenza tra 'c0de' e' C0DE', tutto qui. –

22

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

8

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

string s = Convert.ToBase64String(bytes); 

e utilizzare

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

per ottenere i byte indietro.

2

Bene, è possibile utilizzare il costruttore di stringhe che accetta byte e una codifica, ma probabilmente si otterrà una stringa difficile da gestire poiché potrebbe contenere molti caratteri divertenti (null byte, newline, 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:

53

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 l'esagono "minuscolo", basta fare un .ToLower() e boom.

Si noti che se si esegue questo come un ciclo stretto e molte operazioni questo potrebbe essere costoso poiché ci sono almeno due cast di stringhe implicite e ridimensionamenti in corso.

+0

fa la stessa cosa della soluzione @PhilippeLeybaert, ma in una riga. – sonjz

12

Se ti trovi nel campo "preferenza esadecimale" puoi farlo. Questa è fondamentalmente una versione minimale della risposta di Philippe Leybaert.

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

0

Per chiunque sia interessato un pacchetto Nuget ho creato chiamato CryptoStringify consente 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