Hashfunktionen und Informationssicherheit
Manche Dinge finden wir auf wundersame Weise überall um uns herum wieder, wenn wir sie einmal entdeckt haben, obwohl sie uns vorher nie aufgefallen sind. Hashfunktionen sind dafür ein gutes Beispiel. Sie sind in vielen Anwendungen der Informationstechnik eine wichtige Zutat.
Was sind Hashfunktionen?
Eine Hashfunktion konsumiert beliebige Daten und erzeugt daraus einen Hashwert fester Länge. Dabei hat jede Hashfunktion zwei wesentliche Eigenschaften: 1. Sie erzeugt aus demselben Datenobjekt immer wieder denselben Hashwert. 2. Sie erzeugt aus unterschiedlichen Datenobjekten stets unterschiedliche Hashwerte. Daraus folgt, dass wir jeden Hashwert als eine eindeutige Kennzeichnung für das Datenobjekt verwenden können, aus dem er erzeugt worden ist. Insofern gleicht der Hashwert eines Datenobjektes den Fingerabdrücken eines Menschen: 1. Am selben Menschen werden wir immer wieder dieselben Fingerabdrücke vorfinden. 2. Unterschiedliche Menschen haben stets unterschiedliche Fingerabdrücke. Daher werden Hashwerte im Englischen auch gern als Fingerprints bezeichnet. Schauen wir uns zunächst an, wie Hashfunktionen und Hashwerte für uns in der Informationstechnik von Nutzen sein können.
Anwendung: Beschädigte Daten erkennen
Polaroidbilder verbleichen mit der Zeit, in alten Büchern zerbröselt das Papier und auf klassischen Ölgemälden blättert die Farbe ab. Digitale Datenobjekte scheinen von solchen Zerfallsprozessen nicht betroffen zu sein, aber der Schein trügt! Es kommt immer wieder vor, dass in digitalen Datenbeständen, die für eine lange Zeit auf einem Datenträger verweilen, unbemerkt kleine Fehler entstehen. Wie können wir solche Fehler erkennen? Ganz einfach: indem wir eine Hashfunktion einsetzen und aus unseren Datenobjekten Hashwerte erzeugen. Wenn wir nach Jahren einen verstaubten Datenträger vom Dachboden holen und uns vergewissern wollen, dass die Datenobjekte darin unverändert sind, wenden wir noch einmal dieselbe Hashfunktion auf die Datenobjekte an und vergleichen die alten mit den neuen Hashwerten. Stimmen die Werte überein, können wir sicher sein, dass die Daten unverändert sind. Stimmen die Hashwerte nicht überein, dann sind die Daten beschädigt.

Anwendung: Übertragungsfehler erkennen
Auch bei der Übertragung von Daten über Computernetzwerke kommt es häufig vor, dass die eine oder andere gesendete 1 ihr Ziel als 0 erreicht oder umgekehrt. Die Übertragungsprotokolle im Internet verwenden effiziente Hashfunktionen, um nach jeder Datenübertragung anhand kurzer Hashwerte zu überprüfen, ob ein Fehler aufgetreten ist, und gegebenenfalls eine erneute Übertragung anzufordern.
Allerdings schützen diese Protokollmechanismen nur gegen technische Übertragungsfehler, nicht gegen eine absichtliche und gezielte Manipulation der Daten. Wenn wir uns gegen absichtliche Datenmanipulation absichern wollen, müssen wir dafür eine sogenannte kryptografische Hashfunktion einsetzen.

Kryptografische Hashfunktionen
Wir haben oben als die zweite wesentliche Eigenschaft jeder Hashfunktion angegeben, dass sie aus unterschiedlichen Datenobjekten stets unterschiedliche Hashwerte erzeugt. Leider stimmt das nicht ganz. In der Theorie lässt sich nicht vollständig vermeiden, dass eine Hashfunktion für gewisse Paare von Datenobjekten denselben Hashwert erzeugt. Wenn dieser Fall eintritt, sprechen wir von einer Kollision. Wichtig ist, dass Kollisionen zumindest in der Praxis so unwahrscheinlich sind, dass wir ihre grundsätzliche Möglichkeit gefahrlos ignorieren können. Bei einer gewöhnlichen Hashfunktion genügt es, wenn für zwei zufällig gewählte Datenobjekte eine Kollision auch dann unwahrscheinlich ist, wenn sich die Datenobjekte nur in wenigen Bits unterscheiden.
Eine kryptografische Hashfunktion hat dagegen den besonderen Anspruch, dass eine Kollision in der Praxis selbst dann nicht auftreten darf, wenn eine wirkmächtige Institution, ausgestattet mit mathematischem Spezialwissen, Hochleistungscomputern und viel Geduld, eine gezielte Anstrengung unternimmt, um eine Kollision aufzuspüren. Die Güte einer kryptografischen Hashfunktion messen wir daran, wie resistent sie gegen solche Bemühungen ist. Hochwertige kryptografische Hashfunktionen kommen insbesondere in Anwendungen der Informationssicherheit zum Einsatz.

Anwendung: Gezielte Datenmanipulation erkennen
Wenn ich ein Betriebssystem installiere, ist der erste Schritt häufig, das Herunterladen eines Speicherabbildes von der Webseite einer Linux-Distribution. Diese Abbilder sind sehr große Dateien. Sie herunterzuladen, kann viel Zeit in Anspruch nehmen und ihre Bereitstellung kann auf den Serversystemen für eine hohe Auslastung sorgen. Daher bietet es sich an, diese Speicherabbilder aus alternativen Quellen zu beziehen, zum Beispiel von sogenannten Download-Mirrors oder aus einem Torrent-Schwarm. Wie können wir uns vergewissern, dass es sich trotzdem um exakt das Speicherabbild handelt, das auch auf der offiziellen Webseite zur Verfügung gestellt wird? Sie werden es ahnen: wir verwenden eine kryptografische Hashfunktion. Zusammen mit den Speicherabbildern werden auch die entsprechenden Hashwerte gemäß verschiedener kryptografischer Hashfunktionen veröffentlicht. Nach dem Herunterladen können wir aus dem Speicherabbild erneut einen Hashwert erzeugen und mit dem Wert vergleichen, der auf der offiziellen Webseite veröffentlicht wurde. Stimmen die Werte überein, können wir uns sicher sein, dass es sich Bit für Bit um die Originaldatei handelt. Weil für diesen Zweck keine gewöhnlichen, sondern kryptografische Hashfunktionen eingesetzt werden, sind wir damit nicht nur vor Übertragungsfehlern, sondern auch vor einer gezielten Manipulation des Speicherabbildes geschützt.
Verschiedene kryptografische Hashverfahren
Beispiele für kryptografische Hashverfahren, die heute in der Praxis eingesetzt werden, sind MD5, SHA-1, SHA-256 und SHA-512. Es ist üblich, die erzeugten Hashwerte als Zeichenketten darzustellen, die aus den Ziffern "0" bis "9" und den Buchstaben "a" bis "f" bestehen, aber die Hashverfahren unterscheiden sich in der Länge der erzeugten Hashwerte. Schauen wir uns die Hashwerte der genannten Hashverfahren für die Zeichenkette "Increase Your Skills" an.
"Increase Your Skills"
--MD5------> 6c54f6572d41393a77070ff2fa089fbe (32 Zeichen)
--SHA-1----> 1ddd3ae23ab8823447621899820a0e6a (40 Zeichen)
eae30c43
--SHA-256--> de800a5c324b81f61cc107b8eefab2f1 (64 Zeichen)
eda32e6f1a0bca3105839415b99d2b9a
--SHA-512--> 41a84b6ae00109cb131893f1568a5e35 (128 Zeichen)
9f8366a53d74505c490f4d20844916d7
180a45446284a94f5feca16135423451
feaa612c1ac0bbf334c31c3c4142818f
Die Verfahren MD5 und SHA-1 gelten schon seit einigen Jahren nicht mehr als sicher und werden nicht mehr für den Einsatz in kryptografischen Anwendungen empfohlen. Insbesondere für MD5 sind sehr effiziente Verfahren zur Berechnung von Kollisionen bekannt. Zur Erzeugung hochwertiger, aber nicht kryptografischer Prüfsummen werden diese Verfahren jedoch nach wie vor eingesetzt. Achten Sie bei der Auswahl eines Hashverfahrens stets darauf, ob Sie sich lediglich gegen eine technische Datenkorruption oder auch gegen eine gezielte Datenmanipulation schützen wollen. Zum Schutz vor gezielter Datenmanipulation sollten Sie ein sicheres kryptografisches Hashverfahren einsetzen. Zum Schutz vor technischer Datenkorruption können Sie ein schwächeres Hashverfahren einsetzen und von den kürzeren Hashwerten und der schnelleren Berechnung profitieren. Für Anwendungen, in denen die Kollisionsresistenz keine hohe Priorität hat, können Sie sogar ein einfaches Prüfsummenverfahren wie CRC32 einsetzen, das besonders schnell rechnet und besonders kurze Prüfsummen erzeugt.
"Increase your Skills" --CRC32 --> 7e27dca0 (8 Zeichen)