Kürzen einen Byte-Array im Vergleich zu dem codierten String substringing von SHA-256 kommt aus

StackOverflow https://stackoverflow.com/questions/4494402

  •  12-10-2019
  •  | 
  •  

Frage

Ich bin nicht vertraut mit Hashing-Algorithmen und die damit verbundenen Risiken, wenn mit ihnen und haben daher eine Frage nach der Antwort unten, dass ich auf eine frühere Anfrage erhalten. . .

Auf der Grundlage des Kommentar, dass die Hash-Wert muss, wenn in ASCII codiert, paßt innerhalb von 16 ASCI Zeichen, die Lösung zuerst ist, eine kryptographische Hash-Funktion (die SHA-2-Familie zu wählen, enthält SHA-256, SHA-384, und SHA-512) Dann wird die Ausgabe der ausgewählten Hash-Funktion auf 96 Bits (12 Bytes) trunkieren - die, hält das erste 12 Bytes der Hash-Funktionsausgabe und verwirft die verbleibenden Bytes sind Dann, um Base-64-Codierung des verkürzte Ausgangs bis 16 ASCII-Zeichen (128 Bits) effektiv eine 96-Bit-starke kryptographische Hash ergibt.

Wenn ich die Base-64-codierte Zeichenfolge zu 16 Zeichen String ist, dass grundsätzlich andere dann das erste 12 Bytes der Hash-Funktion zu halten und dann Base64-kodiert, sie? Wenn ja, könnte jemand bitte erklären, (Beispiel-Code zur Verfügung stellen) für das Byte-Array Kürzen?

testete ich den Teil des vollständigen Hash-Wertes gegen 36,000+ unterschiedliche Werte und hatte keine Kollisionen. Der folgende Code ist meine aktuelle Implementierung.

Danke für jede Hilfe (und Klarheit), die Sie zur Verfügung stellen können.

public static byte[] CreateSha256Hash(string data)
{
    byte[] dataToHash = (new UnicodeEncoding()).GetBytes(data);
    SHA256 shaM = new SHA256Managed();
    byte[] hashedData = shaM.ComputeHash(dataToHash);

    return hashedData;
}

public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row)
{
    byte[] hashedData = CreateSha256Hash(Row.HashString);

    string s = Convert.ToBase64String(hashedData, Base64FormattingOptions.None);

    Row.HashValue = s.Substring(0, 16);


}

[Original-Beitrag] (Http://stackoverflow.com/questions/4340471/is-there-a-hash-algorithm-that-produces-a-hash-size-of-64-bits-in-c)

War es hilfreich?

Lösung

Nein, es gibt keinen Unterschied. Allerdings ist es einfacher, nur den Base64-String des ersten 12 Bytes des Arrays zu erhalten, anstatt das Array von Kürzen:

public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row) {

    byte[] hashedData = CreateSha256Hash(Row.HashString);

    Row.HashValue = Convert.ToBase64String(hashedData, 0, 12);

}

Die Basis 64 codiert, legt einfach 6 Bits in jedem Zeichen, SO 3 Bytes (24 Bits) in 4 Zeichen geht. Solange Sie Splitting die Daten zu einem noch 3 Byte-Grenze sind, ist es das gleiche wie Spaltung der String an der sogar 4 Zeichengrenze.

Wenn Sie versuchen, die Daten zwischen diesen Grenzen zu spalten, wird der Base64-String mit Fülldaten bis zur nächsten Grenze aufgefüllt wird, so dass das Ergebnis nicht das gleiche sein würde.

Andere Tipps

Abschneiden ist so einfach wie das Hinzufügen Take(12) hier:

Ändern

 byte[] hashedData = CreateSha256Hash(Row.HashString);

An:

 byte[] hashedData = CreateSha256Hash(Row.HashString).Take(12).ToArray();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top