Hashing
Vorbemerkungen
Begriffe:
- Eingabe: Die Ursprungsdaten, aus welchen der Hash gebildet wird (z.B. Zahl, Text, Binärdaten)
- Hashfunktion: Das Verfahren, mit dem der Hash gebildet wird.
- Hashwert: Das Ergebnis des Hashings.
- Nichtumkehrbarkeit: Der Hash lässt keinen Rückschluss auf die Eingabe zu.
- Kollision: wenn aus zwei Eingaben der selben Hashwert gebildet wird.
- Salt: für Passwort-Hashing benutzt, wird vor dem Hashing an die Eingabe angehängt um Angriffe per vorberechneten Hash-Tabellen zu verhindern.
- Rounds: für Passwort-Hashing benutzt, Hash wird mehrfach berechnet um Brute-Force-Angriffe zu verlangsamen
Ziel:
- 3.3.1.1 (9) das Konzept von Hashfunktionen und Anforderungen an diese (unter anderem Nichtumkehrbarkeit, Vermeidung von Kollisionen) beschreiben und dieses an Beispielen (zum Beispiel Fingerprint, Integritätsprüfung, ISBN-Prüfsumme) erläutern.
- 3.3.4 (4) spezielle Anforderungen an kryptologische Hashfunktionen und Anwendungen in der Kryptologie erläutern (zum Beispiel Fingerprint, Signatur, Passworthashes)
Einführung: Hashfunktion
Unter einer Hashfunktion versteht man eine Funktion, die eine große Eingabemenge auf eine kleinere Zielmenge abbildet. Eine Hashfunktion ist deshalb im Allgemeinen nicht umkehrbar.
Als einfaches Beispiel lässt sich als Hashfunktion für Zahlen die (totale) Quersumme nutzen:
- 15 → 6
- 64 → 1
- 72 → 9
- 923 → 5
- 7302 → 3
- 532 → 1
Anwendungen
Hashing wird zum einen verwendet, um (Übertragungs-)Fehler zu erkennen. Hierbei spricht man oft auch von Prüfsummen (bei kleineren Datenmengen) oder von Fingerprints (eher bei größeren Binärdaten).
Zum anderen wird die Nichtumkehrbarkeit von Hashes dazu verwendet, Passwörter auf sichere Weise abzuspeichern. Hierfür werden zusätzlich zur Fehlererkennung weitere sicherheitsrelevante Eigenschaften an die Hashfunktion gestellt.
Kollisionen
Wie man an dem Beispiel bereits erkennen kann, wird sowohl für die 15 als auch für die 532 der selbe Hash (= die selbe Quersumme) erzeugt. Erzeugen mehrere Ausgangstexte den selben Hash, so spricht man von einer Kollision.
Fehlererkennung und -korrektur
Hashfunktionen werden beispielsweise genutzt, um Fehler zu erkennen und ggf. zu korrigieren. Beispiele hierfür sind die Datenübertragung über das Internet (TCP) oder auch eine IBAN. Hierfür wird zusätzlich zu den eigentlichen Daten ein Hash dieser Daten übertragen bzw. angegeben. Man spricht dabei auch von einer Prüfsumme oder Fingerprint.
Hashverfahren lassen sich dahingehend klassifizieren, ob und wie viele Fehler diese erkennen oder sogar beheben können. Fehler, die auftreten könnten, sind beispielsweise bei einer Überweisung per IBAN:
- Tippfehler einzelner Ziffern
- Vergessen einer Ziffer
- Doppelte Eingabe einer Ziffer
- Vertauschung von zwei Ziffern
Würde man hierfür die Quersumme als Hashfunktion nutzen, so erkennt man direkt, dass zwar ein Fehler mit einer Ziffer erkannt werden könnte, die Quersumme zur Erkennung von Zahlendrehern jedoch nicht geeignet ist.
Damit eine Fehlererkennung zuverlässig funktioniert, sollten selbst kleinste Änderungen an der Eingabe eine möglichst große Änderung des Hashes bewirken.
Ein einfach nachzurechnendes Hashverfahren wird bei ISBN verwendet. Eine ISBN-Nummer besteht aus 9 „Daten-Ziffern“ und einer Prüfziffer. Für die Berechnung der Prüfziffer wird die erste Ziffer der ISB-Nummer mit 1 multipliziert, die zweite mit 2 usw. Am Ende wird die Summe daraus durch 11 geteilt. Der ganzzahlige Rest ergibt die Prüfziffer, bzw. „X“, falls der Rest 10 ergibt:
Beispiel: ISBN 3-446-19313-[?] (Fermats letzter Satz)
3*1 + 4*2 + 4*3 + 6*4 + 1*5 + 9*6 + 3*7 + 1*8 + 3*9 = 162 : 11 = 14 Rest 8 → Prüfziffer 8
Durch die unterschiedliche Wertung der Ziffern werden damit – im Gegensatz zur einfachen Quersumme – auch Zahlendreher erkannt.
Passwortspeicherung als Hash: Kryptologische Anforderungen
Hashfunktionen haben neben der Fehlererkennung noch eine weitere wesentliche Funktion, die inzwischen auch nach DSGVO vorgeschrieben ist. Anbieter von Dienstleistungen dürfen Passwörter von Kunden nicht mehr im Klartext speichern, als Schutz vor Identitätsdiebstahl. Wir dies nicht beachtet, können gegen Unternehmen hohe Strafen verhängt werden.
Wird eine Datenbank von kriminellen Angreifern mithilfe von Sicherheitslücken kopiert, so hätten diese Zugriff auf die Passörter der Kunden, und könnten die selben Passwörter bei anderen Internetdiensten ausprobieren.
Um die Sicherheit auch im Falle eines Datenlecks zu erhöhen, müssen Passwörter z.B. als Hash abgespeichert werden. Damit ein Angreifer aus den Hashes nicht die Passwörter rekonstruieren kann, müssen dort verwendete Hashfunktionen spezielle Anforderungen erfüllen.
Ablauf Passwortüberprüfung und Änderung
Bei der Überprüfung, ob ein Nutzer sein Passwort richtig eingegeben hat, wird von dem eingegebenen Passwort der Hash gebildet und das Ergebnis mit dem in der Datenbank gespeicherten Hash verglichen.
Dabei ist es unerheblich, ob man das richtige Passwort eingegeben hat oder ein anderes verwendet, das aber den selben Hash erzeugt! Würde das Nutzerpasswort „123“ also einfach als Quersumme „6“ abgespeichert, so könnte man sich ebenfalls mit dem Passwort „321“ anmelden. Für einen Angreifer, der sich Zugang zur Datenbank verschafft hat und damit den Passworthash „6“ lesen kann, wäre es ein leichtes, sich ein Passwort zu generieren, welches diese Quersumme erzeugt.
Damit dieser Fall nicht eintritt, müssen Hashfunktionen, die für Passwortabsicherung verwendet werden, kollisionsresistent sein. Das bedeutet: es muss möglichst schwer sein, zwei beliebige Eingaben zu finden, die den selben Hash erzeugen.
Gängige Verfahren waren bzw. sind: (jeweils als Beispiel, ist der Hash von „123456“ abgebildet)
- MD5 (nicht mehr sicher!):
e10adc3949ba59abbe56e057f20f883e - SHA-1 (ebenfalls nicht mehr sicher!):
7c4a8d09ca3762af61e59520943dc26494f8941b - SHA-256:
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 - SHA-512:
ba3253876aed6bc22d4a6ff53d8406c6ad864195ed144ab5c87621b6c233b548baeae6956df346ec8c17f5ea10f35ee3cbc514797ed7ddd3145464e2a0bab413
Zusätzliche Sicherheit durch Salt
Im Internet kursieren für alle gängigen Hashfunktionen diverse Tabellen mit vorberechneten Passwörtern. So kann für das MD5-Verfahren für den Hash e10adc3949ba59abbe56e057f20f883e direkt nachgeschaut werden, dass hierfür die Eingabe „123456“ nötig ist. Für die gängigen Hash-Funktionen existieren entsprechende Wörterbücher, z.B. auf https://crackstation.net.
Um diese Möglichkeit für Angreifer ebenfalls zu unterbinden, speichert man neben dem Hashwert auch noch einen zufällig generierten Salt. Dieser Salt wird an die Benutzereingabe angehängt, bevor der Hash gebildet wird.
Beispiel: für das Nutzerpasswort „123456“ wird ein zufälliger Salt „95be“ generiert und an das Passwort angehängt. Es wird also der Hash von „12345695be“ gebildet und zusammen mit dem Salt gespeichert:
- Hash: 913d6bfec025a4b5faedf786aeb6c1a7
- Salt: 95be
Das ganze passiert serverseitig, völlig unbemerkt vom Benutzer. Die Sicherheit wird dadurch nochmals deutlich erhöht, da durch einen ausreichend langen, zufälligen Salt garantiert werden kann, dass sich diese „gesalzene“ Eingabe nicht mehr in vorberechneten Tabellen nachschlagen lässt. Damit wird selbst ein Passwort wie „123456“ sicherer12 und es bleibt dem Angreifer nur ein Brute-Force-Angriff.
Dieser Salt kann für jeden Benutzer individuell generiert und zusätzlich zum Hash-Wert gespeichert werden.
Hashverfahren zur Signierung und Integritätsprüfung
Neben der sicheren Passwortspeicherung werden Hashverfahren auch dazu genutzt, um Datenübertragungen abzusichern. So lässt sich auch von Binärdaten, Nachrichten o.ä. ein Hashwert bilden und so absichern, dass daran während der Übertragung nichts manipuliert wurde.
Anmerkung: Dazu muss natürlich der Hash-Wert auf einem anderen, sicheren Weg übertragen worden sein!
12 Natürlich ist das Passwort „123456“ dennoch nicht sicher, denn selbst mit einem Brute-Force-Angriff lässt sich dieses sehr schnell herausfinden!
Hintergrundinformationen: Herunterladen [odt][1 MB]
Weiter zu Passworthash