2012-10-19 20 views
18

È necessario ottenere l'hash MD5 dalla stringa.
Ottieni un errore MD5 è nullo.
Mi sto legando per ottenere un hash MD5 a 32 caratteri da una stringa.MD5 Hash From String

using (System.Security.Cryptography.MD5 md5 = 
     System.Security.Cryptography.MD5.Create("TextToHash")) 
{ 
    byte[] retVal = md5.Hash; 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < retVal.Length; i++) 
    { 
     sb.Append(retVal[i].ToString("x2")); 
    } 
} 

risposta

42

necessità di ottenere MD5 hash da stringa.

Quindi prima è necessario convertire la stringa in dati binari in qualche modo. Il modo in cui lo fai dipenderà dalle tue esigenze, ma probabilmente sarà lo per alcune codifiche ... devi risolvere lo che però è la codifica. Questo hash deve corrispondere all'hash creato da qualche altra parte, ad esempio?

Ottenere un errore MD5 è nullo.

Questo perché si utilizza MD5.Create in modo errato. L'argomento è un nome di algoritmo . Dovresti quasi certamente usare semplicemente lo parameterless overload.

ho il sospetto che si desidera qualcosa di simile:

byte[] hash; 
using (MD5 md5 = MD5.Create()) 
{ 
    hash = md5.ComputeHash(Encoding.UTF8.GetBytes(text)); 
} 
// Now convert the binary hash into text if you must... 
+1

Se provenisse da SQL vachar (max), UTF8 sarebbe la migliore scommessa? – Paparazzi

+0

re: overload senza parametri: esiste il rischio che l'algoritmo predefinito cambi da una versione .Net alla successiva? Se è così, gli hash della stessa stringa da una versione alla successiva non corrisponderanno? – xanadont

+2

@xanadont: No. MD5 è un algoritmo standardizzato. Il cambiamento dei risultati sarebbe fondamentalmente un bug. –

19

la stringa passata a Create non è il "testo di hash", ma l'algoritmo da utilizzare. Ho il sospetto che si desidera:

using (System.Security.Cryptography.MD5 md5 = 
    System.Security.Cryptography.MD5.Create()) 
{ 
    byte[] retVal = md5.ComputeHash(Encoding.Unicode.GetBytes("TextToHash")); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < retVal.Length; i++) 
    { 
     sb.Append(retVal[i].ToString("x2")); 
    } 
} 
+1

Ciao Reed: ho una domanda: come faccio a sapere quale codifica usare? Nel mio caso, ho bisogno di calcolare un hash che ho ricevuto come stringa di query. (quindi quando è stato postato http, era probabilmente UTF-8), TUTTAVIA, una volta che è stato memorizzato in una stringa .Net, sarebbe ora in Unicode (UTF-16), perché quella è la codifica nativa? Questa trasformazione è avvenuta per me? – JMarsch

+0

@JMarsch Sì, probabilmente "funzionerà" se si utilizza Encoding.Unicode, se originariamente era UTF-8. –

+0

Ricorda che se il tuo MD5 "sorgente" è stato calcolato sulla presentazione utf-8 della tua stringa, otterrai un MD5 diverso se invece usi utf-16. Questo è vero anche se si hanno solo caratteri ASCII all'interno della stringa. – brighty

1

La ragione si stanno ottenendo un ritorno null è il parametro string al metodo Create speciies l'algoritmo, non il testo che viene generato un hash. Non esiste un algoritmo TextToHash, quindi si ottiene null come ritorno.