Donnerstag, 6. September 2012

MD5 Hash einer Zeichenkette berechnen

Im heutigen Post möchte ich vorstellen, wie man mit C# den MD5-Hashwert einer Zeichenkette berechnet.
Kurz etwas allgemeines zum Prinzip des Hashings:
Eine Hashfunktion ist eine Funktion, die aus einer Eingabe variabler Länge eine Ausgabe fixer Länge erzeugt.
Die Funktion sollte einerseits nicht bzw. nur schwer invertierbar sein, das heißt, aus der Ausgabe darf kein Rückschluss auf die Eingabe möglich sein.
Andererseits soll die Funktion möglichst wenige Kollisionen erzeugen, das heißt, verschiedene Eingabe sollen verschiedene Ausgaben erzeugen und außerdem sollen kleine Änderungen in der Eingabe zu großen Änderungen in der Ausgabe führen.

Wofür nun das Ganze?
Ein Beispiel ist die Speicherung von Passwörtern auf einem Webserver. Die Passwörter werden nicht im Klartext gespeichert sondern gehasht. So kann einerseits der Administrator selber nicht die Passwörter der Kunden einsehen, da er den Hashwert ja nicht zurückberechnen kann, gleichzeitig können natürlich auch Eindringlinge selbiges nicht tun.
Ein weiteres Beispiel ist die Hashsummen Berechnung von Dateien, etwa um korrekte Übertragungen zu überprüfen. Die ganze Datei mit dem Original zu vergleichen wäre zu aufwending, also vergleicht man die Hashwerte. Stimmen diese überein, sind die Dateien wegen der Kollisionsarmut der Hashfunktion mit hoher Wahrscheinlichkeit identisch, ist bereits ein kleiner Teil der Datei inkorrekt, ist der Hashwert wahrscheinlich erheblich anders.

Nun zum Code. using System.Security.Cryptography vorausgesetzt berechnet folgender Code den Hashwert einer Zeichenkette:
MD5 Md5Hash = MD5.Create();
byte[] Data = Md5Hash.ComputeHash(Encoding.Default.GetBytes("Zu hashende Zeichenkette"));
string Hash =  System.BitConverter.ToString(Data);
Die 1. Zeile erzeugt ein MD5 Objekt. In der 2. Zeile wird die Zeichenkette per MD5 gehasht und der Hash als byte - Array zurückgegeben. Die Funktion ToString() in der 3. Zeile von BitConverter wandelt dieses Array schließlich in einen Hexadezimalstring um, die meist genutzte Darstellung eines Hashwerts.

Kommentare: