Pytanie Jak mogę SHA512 ciąg w C #?


Próbuję napisać funkcję, aby pobrać ciąg i sha512 to tak?

public string SHA512(string input)
{
     string hash;

     ~magic~

     return hash;
}

Jaka powinna być magia?

P.S. Próbowałem następujących rzeczy, ale hash utrzymywała się na poziomie 64 bajtów (nie 128 zgodnie z oczekiwaniami).

byte[] data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
byte[] hash;
SHA512 shaM = new SHA512Managed();
hash = shaM.ComputeHash(data);

Z góry dziękuję!


21
2017-07-06 18:28


pochodzenie


8 * 64 = 512 hash - Andrew T Finnell


Odpowiedzi:


Twój kod jest poprawny, ale powinieneś pozbyć się instancji SHA512Managed:

using (SHA512 shaM = new SHA512Managed())
{
   hash = shaM.ComputeHash(data);
}

512 bitów to 64 bajty.

Aby przekonwertować ciąg na tablicę bajtów, należy określić kodowanie. UTF8 jest w porządku, jeśli chcesz utworzyć kod skrótu:

var data = Encoding.UTF8.GetBytes("text");    
using (...

43
2017-07-06 18:33



Liczba przykładów, które nie wykorzystują w jakikolwiek sposób, jest zdumiewająca. Kudos za pokazanie idiomatycznego sposobu using. - Jesse C. Slicer
Zamiast var data = Encoding.UTF8.GetByteCount(foo), posługiwać się var data = Encoding.UTF8.GetBytes(foo). - luiscubal
luiscubal, dziękuję, naprawione. - Carsten Schütte
Dzięki, to świetnie. - James
Nie mieszaj gromadzenia śmieci i uwalniania / usuwania nieużywanych obiektów niezarządzanych. Użycie "use" powoduje, że wywołanie zostanie wywołane, gdy kończy się użycie bloku. Spowoduje to uwolnienie niezarządzanych zasobów - w przeciwnym razie zostaną zwolnione, gdy GC wyczyści obiekt (i wewnętrznie wywoła finalizator). Klasa SHA512Managed jest jednorazowa, więc wolę używać. Aby uzyskać więcej informacji na temat wzoru usuwania, spójrz na msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx - Carsten Schütte


To jeden z moich projektów:

public static string SHA512(string input)
{
    var bytes = System.Text.Encoding.UTF8.GetBytes(input);
    using (var hash = System.Security.Cryptography.SHA512.Create())
    {
        var hashedInputBytes = hash.ComputeHash(bytes);

        // Convert to text
        // StringBuilder Capacity is 128, because 512 bits / 8 bits in byte * 2 symbols for byte 
        var hashedInputStringBuilder = new System.Text.StringBuilder(128);
        foreach (var b in hashedInputBytes)
            hashedInputStringBuilder.Append(b.ToString("X2"));
        return hashedInputStringBuilder.ToString();
    }
}

Proszę zanotować:

  1. Obiekt SHA512 jest usuwany (sekcja "używanie"), więc nie mamy żadnych wycieków zasobów.
  2. StringBuilder służy do efektywnego budowania ciągów szesnastkowych.

12
2017-08-24 19:41



Kod StringBuilder można zastąpić pojedynczą linią "var hash = BitConverter.ToString (hashedInputBytes) .Replace (" - "," "); ' msdn.microsoft.com/en-us/library/... - Michael Freidgeim


512/8 = 64, więc 64 jest rzeczywiście prawidłowym rozmiarem. Być może chcesz przekonwertować go na szesnastkowy po algorytm SHA512.

Zobacz też: Jak przekonwertować tablicę bajtową na łańcuch szesnastkowy i na odwrót?


8
2017-07-06 18:32



Tak, masz całkowitą rację. Właśnie użyłem generatora online do porównania z, który zrobił hex. Dzięki :) - James
Łącze nie konwertuje ciągu znaków na tablicę bajtów, konwertuje łańcuch szesnastkowy na bajty. Aby przekonwertować ciąg na tablicę bajtów, użyj czegoś podobnego Encoding.UTF8.GetByteCount("text") - Carsten Schütte
@ CarstenSchütte Cóż, UTF-8 służy do kodowania tekstu, co nie jest związane z tym pytaniem. I tak czy inaczej, GetByteCount nie konwertuje łańcucha na tablicę bajtów. To dostanie tylko długość tablicy bajtów. - luiscubal
@ CarstenSchütte Och, poczekaj. Chyba wiem, co miałeś na myśli. Mówisz o uzyskaniu początkowej zmiennej "danych", prawda? W takim przypadku tak, UTF-8 jest w porządku. Mimo to, GetByteCount nadal nie jest odpowiednią funkcją. - luiscubal
@luiscubal: Niestety, GetByteCount to moja wina (i błąd kopiowania / wklejania). Oczywiście, aby pobrać dane, musisz użyć GetBytes (). - Carsten Schütte


Nie wiem, dlaczego spodziewasz się 128.

8 bitów w bajcie. 64 bajty. 8 * 64 = 512 bitów mieszania.


1
2017-07-06 18:32





Od Dokumentacja MSDN:
Rozmiar skrótu dla algorytmu SHA512Managed wynosi 512 bitów.


1
2017-07-06 18:33





Można użyć klasy System.Security.Cryptography.SHA512

MSDN na SHA512

Oto przykład, zwrócony z MSDN

byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);

1
2017-07-06 18:34





Zamiast WinCrypt-API przy użyciu System.Security.Cryptography, możesz również użyć BouncyCastle:

public static byte[] SHA512(string text)
{
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(text);

    Org.BouncyCastle.Crypto.Digests.Sha512Digest digester = new Org.BouncyCastle.Crypto.Digests.Sha512Digest();
    byte[] retValue = new byte[digester.GetDigestSize()];
    digester.BlockUpdate(bytes, 0, bytes.Length);
    digester.DoFinal(retValue, 0);
    return retValue;
}

Jeśli potrzebujesz wersji HMAC (aby dodać uwierzytelnienie do hasha)

public static byte[] HmacSha512(string text, string key)
{
    byte[] bytes = Encoding.UTF8.GetBytes(text);

    var hmac = new Org.BouncyCastle.Crypto.Macs.HMac(new Org.BouncyCastle.Crypto.Digests.Sha512Digest());
    hmac.Init(new Org.BouncyCastle.Crypto.Parameters.KeyParameter(System.Text.Encoding.UTF8.GetBytes(key)));

    byte[] result = new byte[hmac.GetMacSize()];
    hmac.BlockUpdate(bytes, 0, bytes.Length);
    hmac.DoFinal(result, 0);

    return result;
}

1
2017-09-21 10:36



Czym jest BouncyCastle? - Mikael Dúi Bolinder
@ MikaelDúiBolinder: The Bouncy Castle Crypto API obsługiwane są przez australijską organizację charytatywną, Legion of the Bouncy Castle Inc., która zajmuje się opieką i karmieniem API Bouncy Castle. bouncycastle.org - Stefan Steiger


UnicodeEncoding UE = new UnicodeEncoding();            
        byte[] message = UE.GetBytes(password);
        SHA512Managed hashString = new SHA512Managed();
        string hexNumber = "";
        byte[]  hashValue = hashString.ComputeHash(message);
        foreach (byte x in hashValue)
        {
            hexNumber += String.Format("{0:x2}", x);
        }
        string hashData = hexNumber;

0
2018-06-02 10:45