2015-07-01 24 views
6

Gdybym hash ciąg „hasło” w języku C# za pomocą SHA256 pomocą poniższego sposobu uzyskać to jako mój wyjścia:SHA256 hash String w C# nie zgadza się z hash na stronie

e201065d0554652615c320c00a1d5bc8edca469d72c2790e24152d0c1e2b6189 

Ale this website(SHA-256 produces a 256-bit (32-byte) hash value) mówi mi, ma to:

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 

Mam wyraźnie problem z formatem danych lub coś podobnego. Jakieś pomysły, dlaczego ta metoda C# SHA256Managed zwraca coś innego? Wysyłam metodę "password" jako parametr wejściowy.

private static string CalculateSHA256Hash(string text) 
    { 
     UnicodeEncoding UE = new UnicodeEncoding(); 
     byte[] hashValue; 
     byte[] message = UE.GetBytes(text); 

     SHA256Managed hashString = new SHA256Managed(); 
     string hex = ""; 

     hashValue = hashString.ComputeHash(message); 
     foreach (byte x in hashValue) 
     { 
      hex += String.Format("{0:x2}", x); 
     } 
     return hex; 
    } 
+2

Nie używaj skrótów SHA256 do przechowywania haseł (zakładając, że projektujesz to od zera). Zapoznaj się z nowoczesnymi metodami przechowywania haseł, powinieneś użyć czegoś takiego: https://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes(v=vs.110).aspx lub inna metoda wielokrotnej iteracji. – willaien

+1

Dzięki za link. Używamy SHA256, backend jest solenie unikalny dla użytkownika, a my nie jesteśmy podwójnym hashing. Wygląda na to, że możemy ulepszyć korzystanie z PBKDF2 zamiast SHA256. – LampShade

Odpowiedz

13

UnicodeEncoding jest UTF-16, gwarantowana nadmuchać wszystkie swoje postacie do dwóch do czterech bajtów do reprezentowania ich punkt kodu Unicode (patrz także sekcja Uwagi o MSDN).

Zamiast tego użyj (statyczny) Encoding.UTF8, aby większość znaków zmieściła się w jednym bajcie. To zależy od tego, jakiego systemu potrzebujesz, aby naśladować, czy to będzie działać dla wszystkich łańcuchów.

+0

To wszystko, dzięki! – LampShade