2009-08-19 13 views
18

Czy mógłbyś mi doradzić jakiś prosty algorytm hashowania hasłem użytkownika przez MD5, ale z sól dla zwiększenia niezawodności.Skrót MD5 z solą do przechowywania hasła w DB w C#

Teraz mam ten jeden:

private static string GenerateHash(string value) 
{ 
    var data = System.Text.Encoding.ASCII.GetBytes(value); 
    data = System.Security.Cryptography.MD5.Create().ComputeHash(data); 
    return Convert.ToBase64String(data); 
} 
+5

Dlaczego warto używać uszkodzonego skrótu, takiego jak MD5? Przynajmniej użyj czegoś takiego jak SHA-256. –

+6

Cóż, dlaczego NIE używać MD5? Używanie soli w rozsądnym stopniu zmniejsza podatność na uszkodzenia ze względu na brak odporności na kolizje przez MD5, nie? –

+1

@Greg, czy mógłbyś podać przykład użycia soli za pomocą soli? – abatishchev

Odpowiedz

40

Można użyć klasy HMACMD5:

var hmacMD5 = new HMACMD5(salt); 
var saltedHash = hmacMD5.ComputeHash(password); 

Works with SHA-1, SHA256, SHA384, SHA512 i RIPEMD160, a także:

var hmacSHA1 = new HMACSHA1(salt); 
var saltedHash = hmacSHA1.ComputeHash(password); 

Zarówno salt i password spodziewane są w postaci tablic bajtowych .

Jeśli masz ciągi musisz przekonwertować je na bajtów pierwszy:

var salt = System.Text.Encoding.UTF8.GetBytes("my salt"); 
var password = System.Text.Encoding.UTF8.GetBytes("my password"); 
+1

http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha1.hmacsha1.aspx Konstruktor HMACSHA1 nie przyjmuje soli, ale klucz jako pojedynczy parametr – abatishchev

+4

HMAC jest zazwyczaj używany do uzyskania klucza skrót wiadomości. Jeśli zamienisz klucz na sól i wiadomość z hasłem, możesz użyć HMAC, aby uzyskać solony hash hasła. – dtb

+0

Czy istnieje sposób odszyfrowania solonego hasła? – Sana

12

Oto sample. Obsługuje MD5, SHA1, SHA256, SHA384 i SHA512.

+0

Szkoda, że ​​ta odpowiedź nie była wyglądająca jak kod, jako zaakceptowana. jest wysoce/bardziej użyteczny i szybki w realizacji. dzięki! – zanlok

1

Microsoft zrobić to praca dla ciebie, ale to zajmuje trochę kopania. Zainstaluj rozszerzenia usług sieciowych w wersji 3.0 i spójrz na funkcję Microsoft.Web.Services3.Security.Tokens.UsernameToken.ComputePasswordDigest z Reflectorem.

Chciałbym umieścić tutaj kod źródłowy do tej funkcji, ale nie jestem pewien, czy to legalne. Jeśli ktokolwiek może mnie uspokoić, zrobię to.

+3

Podejrzewam, że legalność zależy w dużym stopniu od tego, gdzie jesteś. W niektórych jurysdykcjach nielegalne jest nawet samodzielne przyjrzenie się samemu dekompilowanemu kodowi, nie mówiąc już o tym, żeby inni go obejrzeli! – LukeH

+2

Chociaż w Visual Studio 2008 możliwe jest przeglądanie kodu źródłowego .net podczas debugowania, pod warunkiem, że najpierw zgodziłeś się na T & C MS. –

3

Oprócz klasy HMACSHA1 wspomniano powyżej, jeśli wystarczy szybki solona hash, to jesteś już 95% drogi tam:

private static string GenerateHash(string value, string salt) 
{ 
    byte[] data = System.Text.Encoding.ASCII.GetBytes(salt + value); 
    data = System.Security.Cryptography.MD5.Create().ComputeHash(data); 
    return Convert.ToBase64String(data); 
} 

Prawdziwą sztuką jest przechowywanie soli w bezpieczna lokalizacja, na przykład twój plik machine.config.

+0

Czy znacznik czasu może być dobrą solą? lub odkrycie takiego faktu naruszy cały algorytm? – abatishchev

+0

Znacznik czasu nie będzie działać, ponieważ po przejściu do sprawdzania wartości mieszania względem nowych danych wejściowych czas będzie inny. – Fantius

+0

Chyba, że ​​przechowujesz znacznik czasu wraz ze skrótem, w takim przypadku zadziała, ale nie będzie bardzo bezpieczny. – Fantius

Powiązane problemy