2013-06-08 24 views
20

Mam ciąg znaków i chcę go zaszyfrować za pomocą funkcji skrótu SHA-256 przy użyciu C#. Chcę coś takiego:Uzyskaj ciąg znaków SHA-256

string hashString = sha256_hash("samplestring"); 

Czy jest coś wbudowanego w ramy, aby to zrobić?

+1

http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256.aspx. -1. –

+2

Hasche działają na bajty, a nie na ciągi. Najpierw musisz wybrać kodowanie, które przekształci ciąg w bajty. Polecam do tego UTF-8. – CodesInChaos

+0

Coś mi mówi, że ludzie czytający ten wpis powinni również sprawdzić: https://stackoverflow.com/questions/4948322/fundamental-difference-between-hashing-and-encryption-algorithms – Ziezi

Odpowiedz

65

Realizacja może być jak ten

public static String sha256_hash(String value) { 
    StringBuilder Sb = new StringBuilder(); 

    using (SHA256 hash = SHA256Managed.Create()) { 
    Encoding enc = Encoding.UTF8; 
    Byte[] result = hash.ComputeHash(enc.GetBytes(value)); 

    foreach (Byte b in result) 
     Sb.Append(b.ToString("x2")); 
    } 

    return Sb.ToString(); 
} 

EDIT:LINQ realizacja jest bardziej zwięzły, ale, prawdopodobnie, mniej czytelny:

public static String sha256_hash(String value) { 
    using (SHA256 hash = SHA256Managed.Create()) { 
    return String.Concat(hash 
     .ComputeHash(Encoding.UTF8.GetBytes(value)) 
     .Select(item => item.ToString("x2"))); 
    } 
} 

Edycja 2 : .NET Core

public static String sha256_hash(string value) 
{ 
    StringBuilder Sb = new StringBuilder(); 

    using (var hash = SHA256.Create())    
    { 
     Encoding enc = Encoding.UTF8; 
     Byte[] result = hash.ComputeHash(enc.GetBytes(value)); 

     foreach (Byte b in result) 
      Sb.Append(b.ToString("x2")); 
    } 

    return Sb.ToString(); 
} 
+0

jak odszyfrować hash z powrotem do hasła? –

+6

@daniel metlitski: ty * nie można *: hash to * funkcja jednokierunkowa *, możesz obliczyć hash, ale nie możesz odzyskać argumentu. Podczas rejestracji nowego użytkownika nie przechowuj hasła, ale jego hash; na uwierzytelnianie, oblicz hash na podane hasło i porównaj hash z przechowywanym hashem. –

+0

Wszystko jest fajne, ale twoja konwencja nazewnictwa jest okropna - wielkie zmienne lokalne, małe nazwy metod - oto dobry wykład na wieczór: https://docs.microsoft.com/en-us/dotnet/standard/design- wytyczne/ogólne konwencje nazewnictwa –