Informatik · Klasse 10–13 · aktualisiert
Hashfunktion einfach erklärt: Hashwerte verstehen
Du lernst, was Hashfunktion, Hashwert und Kollision sind, rechnest einen Modulo-Hash und unterscheidest Hashing von Verschlüsselung.
0 von 10 Aufgaben gelöst
Kurz gesagt
Eine Hashfunktion bildet eine große Menge von Eingaben auf eine kleinere Menge von Hashwerten ab. Bekommen zwei verschiedene Eingaben denselben Hashwert, nennt man das Kollision. Beim Modulo-Hash gilt h(key) = key mod tablesize, das ist der Rest der Division.
Wenn du dich irgendwo anmeldest, kann ein System dein Passwort prüfen, ohne es im Klartext zu speichern. Dabei hilft ein Hashwert. Hashwerte helfen auch beim schnellen Suchen in großen Datenmengen und beim Prüfen von Dateien. Hier lernst du, wie das funktioniert und warum Hashing nicht dasselbe ist wie Verschlüsselung.
Deine Lernziele
Hake ab, was du schon kannst. Löst du alle Aufgaben eines Abschnitts, hakt Mela das Ziel für dich ab.
4 Abschnitte
Eine Hashfunktion ist eine Abbildung. Sie nimmt eine große Menge möglicher Eingaben, die Schlüssel, und ordnet jeder Eingabe einen Wert aus einer kleineren Zielmenge zu. Diese Werte heißen Hashwerte. Die Eingaben können unterschiedlich lang sein. Die Hashwerte haben dagegen meist eine feste Länge.
Weil die Zielmenge kleiner ist, ist eine Hashfunktion im Allgemeinen nicht injektiv. Das heißt: Zwei verschiedene Eingaben können zum selben Hashwert führen. Das nennt man eine Kollision. Da die Menge der möglichen Hashwerte meist kleiner ist als die der möglichen Eingaben, sind Kollisionen dann prinzipiell unvermeidlich.
Eine gute Hashfunktion erzeugt für die Eingaben, für die sie entworfen wurde, möglichst wenige Kollisionen. Für bekannte und beschränkte Eingabemengen können auch perfekte, also kollisionsfreie, Hashfunktionen gefunden werden.
Ein Hashwert wird auch Fingerprint genannt (englisch für Fingerabdruck). Er stellt eine nahezu eindeutige Kennzeichnung einer größeren Datenmenge dar, so wie ein Fingerabdruck einen Menschen nahezu eindeutig identifiziert.
Definition
Kollision
Eine Kollision tritt auf, wenn unterschiedlichen Eingaben derselbe Hashwert zugeordnet wird.
Beispiel: Die einstellige Quersumme als Hashfunktion
- 1Die einstellige Quersumme ist eine sehr einfache Hashfunktion.
- 225 → 2 + 5 = 7
- 352 → 5 + 2 = 7
- 4Die Eingaben 25 und 52 sind verschieden, haben aber denselben Hashwert 7. Das ist eine Kollision.
Teste dich
Eine Hashtabelle ist eine Indexstruktur, mit der man Datenelemente in einer großen Datenmenge sucht. Die Hashfunktion berechnet die Position eines Objekts in der Tabelle. Dadurch erübrigt sich das Durchsuchen vieler Datenobjekte. In der Praxis wird die Tabelle als Array implementiert.
Bei der Divisionsmethode wird ein Schlüssel einem Hashwert zugeordnet, indem man den Rest des Schlüssels bei Division durch die Größe der Hashtabelle berechnet. Die Formel lautet: h(key) = key mod tablesize. Dabei ist key der Schlüssel, tablesize die Größe der Hashtabelle und mod (Modulo) steht für den Rest der Division. Der Hashwert bestimmt das Fach der Tabelle, in dem das Datenobjekt liegt. Dieses Fach heißt Bucket (englisch für Behälter).
So gehst du vor: Teile key durch tablesize, nur mit ganzen Zahlen. Der Rest ist der Hashwert. Weil nur eine einzige Divisionsoperation nötig ist, ist dieses Verfahren ziemlich schnell.
Landen zwei Schlüssel im selben Fach, ist das eine Kollision. Dann muss die Tabelle mehrere Werte im selben Bucket aufnehmen. Kollidierte Daten werden nach einer Ausweichstrategie in alternativen Feldern oder in einer Liste gespeichert. Bei der Suche vergleicht man dann den Suchschlüssel mit den Objekten im Bucket.
Definition
Modulo-Hash
Ein Modulo-Hash ordnet einem Schlüssel den Rest bei Division durch die Größe der Hashtabelle zu: h(key) = key mod tablesize.
Beispiel: Ausgedachtes Beispiel: Tabellengröße 7
- 1Annahme: tablesize = 7 und h(key) = key mod 7
- 225 : 7 = 3 Rest 4, also h(25) = 4
- 332 : 7 = 4 Rest 4, also h(32) = 4
- 440 : 7 = 5 Rest 5, also h(40) = 5
- 525 und 32 landen im selben Bucket 4. Das ist eine Kollision.
Merke: Der Hashwert ist der Rest der Division, nicht das Ergebnis der Division.
Teste dich
Je nach Anwendung hat man unterschiedliche Anforderungen an eine Hashfunktion. Für eine Hashtabelle sind wenige Kollisionen wichtig, die Hashwerte sollen möglichst gleichmäßig verteilt sein. Außerdem muss die Funktion schnell berechenbar sein. Mit steigendem Füllgrad der Tabelle, also je voller sie wird, wächst die Wahrscheinlichkeit einer Kollision. Schlimmstenfalls entartet die Tabelle: Wenige Hashwerte sind sehr vielen Objekten zugewiesen, andere bleiben unbenutzt.
Bei der Divisionsmethode kommt es auch auf die Größe der Tabelle an. Sie sollte keine Potenz einer Zahl sein. Eine Primzahl, die nicht zu nah bei einer Zweierpotenz liegt, ist oft eine gute Wahl.
Prüfsummen erkennen Übertragungsfehler. Wie gut eine Hashfunktion dafür taugt, hängt von ihrer Kollisionswahrscheinlichkeit ab. Die Quersumme ist als Prüfsumme nicht gut geeignet, weil vertauschte Ziffern nicht auffallen: 25 und 52 haben dieselbe Quersumme. Soll die Prüfsumme vor gezielten Manipulationen schützen, nimmt man eine kryptographische Hashfunktion, also eine für die Kryptologie entworfene. Bei ihr kann nur mit sehr hohem Rechenaufwand eine Kollision gefunden werden.
Kryptographische Hashfunktionen sind kollisionsresistente Einwegfunktionen. Kollisionsresistent heißt: Es ist praktisch unmöglich, Kollisionen absichtlich zu finden. Einwegfunktion heißt: Aus dem Hashwert lässt sich der Eingabewert praktisch nicht bestimmen. Diese Eigenschaften sind notwendig, um zum Beispiel die Integrität von Daten sicherzustellen, also zu prüfen, ob sie verändert wurden. Dafür wendet man die Funktion auf die Datei an und vergleicht mit einem bekannten Hashwert. Weicht er ab, wurde die Datei verändert. Ein Angreifer könnte aber Datei und Hashwert zugleich verändern. Dagegen kann ein schlüsselbasiertes Verfahren helfen, zum Beispiel eine digitale Signatur oder ein Message Authentication Code (ein Prüfwert, der mit einem geheimen Schlüssel berechnet wird).
Auch Passwörter werden mit solchen Hashfunktionen gespeichert: Das System vergleicht den Hashwert des eingegebenen Passworts mit dem gespeicherten Hashwert. Stimmen beide überein, ist das Passwort mit sehr hoher Wahrscheinlichkeit richtig. Außerdem sollen bei kryptologischen Hashfunktionen ähnliche Eingaben zu völlig verschiedenen Hashwerten führen.
| Anwendung | Wichtige Eigenschaften |
|---|---|
| Hashtabelle | Wenige Kollisionen, gleichmäßige Verteilung, schnelle Berechnung |
| Prüfsumme | Geringe Kollisionswahrscheinlichkeit |
| Passwörter speichern | Kryptographische Hashfunktion: Einwegfunktion und Kollisionsresistenz |
Beispiel: Adresskartei nach dem ersten Buchstaben
- 1Eine Adresskartei wird nach dem ersten Buchstaben des Nachnamens gruppiert.
- 2Für Menschen ist das praktisch: Man durchsucht nur einen von 26 Teilen.
- 3Aber viele Namen beginnen mit demselben Buchstaben, und sie kommen ungleichmäßig oft vor.
- 4Bei Personalakten hat man oftmals viele Akten im Ordner S, während der Ordner Q leer bleibt.
- 5Ein Computerprogramm braucht möglichst wenige Kollisionen. Dafür ist diese Hashfunktion nicht gut.
Merke: Es gibt nicht die eine beste Hashfunktion. Welche Eigenschaft wichtig ist, hängt von der Anwendung ab.
Teste dich
Verschlüsselung ist die Umwandlung von Informationen, dem Klartext, in einen Geheimtext. Sie geschieht mit kryptografischen Verfahren und einem geheimzuhaltenden Schlüssel, der nur den befugten Personen bekannt sein darf. Mit Kenntnis des Schlüssels kann der Geheimtext wieder in den Klartext zurückgewandelt werden. Das heißt Entschlüsselung.
Eine kryptographische Hashfunktion hat keinen solchen Rückweg. Sie erzeugt aus der Eingabe einen Hashwert fester Länge und ist eine Einwegfunktion. Der Inhalt soll nicht aus dem Hashwert rekonstruiert werden können. Der Hashwert soll einen Inhalt nahezu eindeutig kennzeichnen, ohne etwas über den Inhalt zu verraten. Diese Unumkehrbarkeit wird speziell von kryptologischen Hashfunktionen gefordert.
Bei Passwörtern heißt das: Das System speichert nur den Hashwert. Ein Angreifer mit Lesezugriff auf die Datenbank erlangt so nicht das Passwort. Im Idealfall kann er es aus dem Hashwert nicht oder nur mit erheblichem Aufwand rekonstruieren.
In einer Wikibooks-Anleitung zu PHP heißt es, man könne die Passwörter nicht einfach entschlüsseln, und dort wird von einer „Hashverschlüsselung“ gesprochen. Das Wort ist missverständlich: Eine Einwegfunktion hat anders als die Verschlüsselung keinen Rückweg zum Klartext. Der Angreifer müsste alle möglichen Passwörter hashen und mit dem gespeicherten Wert vergleichen.
Definition
Verschlüsselung
Verschlüsselung wandelt einen Klartext mit einem geheimzuhaltenden Schlüssel in einen Geheimtext um. Mit dem Schlüssel kann man ihn wieder entschlüsseln.
Beispiel: Verschiebung um drei Stellen und Passwort-Hash im Vergleich
- 1Verschlüsselung mit dem geheimen Schlüssel „C“: Jeder Buchstabe wird um drei Stellen im Alphabet verschoben.
- 2a → D, b → E, z → C
- 3Rückweg: Wer den Schlüssel kennt, macht daraus wieder den Klartext.
- 4Passwort-Hash: Das System speichert nur den Hashwert des Passworts.
- 5Bei der Anmeldung vergleicht es den Hashwert des eingegebenen Passworts mit dem gespeicherten Hashwert.
Merke: Verschlüsselung hat mit dem Schlüssel einen Rückweg. Eine kryptographische Hashfunktion ist eine Einwegfunktion.
Teste dich
Alles auf einen Blick
Hashfunktion
Hashfunktion
Sie bildet eine große Eingabemenge auf eine kleinere Menge von Hashwerten ab.
Kollision
Verschiedene Eingaben erhalten denselben Hashwert. Das ist meist prinzipiell unvermeidlich.
Modulo-Hash
h(key) = key mod tablesize, also der Rest der Division.
Anwendung
Welche Eigenschaft wichtig ist, hängt davon ab, ob es um Hashtabelle, Prüfsumme oder Passwörter geht.
Verschlüsselung
Mit dem Schlüssel gibt es einen Rückweg zum Klartext, bei einer kryptographischen Hashfunktion praktisch nicht.
Musteraufgabe · Schritt für Schritt
Vier Schlüssel in eine Tabelle der Größe 5 einordnen (ausgedachtes Beispiel)
- 1Aufgabe: Ordne die Schlüssel 12, 17, 23 und 30 mit h(key) = key mod 5 den Fächern 0 bis 4 zu.
- 212 : 5 = 2 Rest 2, also h(12) = 2
- 317 : 5 = 3 Rest 2, also h(17) = 2
- 423 : 5 = 4 Rest 3, also h(23) = 3
- 530 : 5 = 6 Rest 0, also h(30) = 0
- 6Ergebnis: Fach 0 enthält 30, Fach 2 enthält 12 und 17, Fach 3 enthält 23. Die Fächer 1 und 4 bleiben leer.
- 712 und 17 kollidieren in Fach 2. Probe: 3 · 5 + 2 = 17
Fehler finden
Prüfe die Rechnung mit Tabellengröße 11 (ausgedachtes Beispiel) In einer Zeile steckt ein Fehler. Tippe sie an.
Fehler in Zeile 4Hier wurde das Ergebnis der Division statt des Rests genommen. Richtig: h(50) = 6, denn 50 = 4 · 11 + 6.
Lückentext
Wähl in jeder Lücke das passende Wort und prüf dann deine Antworten.
Eine Kollision liegt vor, wenn Eingaben denselben Hashwert erhalten. Beim Modulo-Hash ist der Hashwert der , wenn du key durch tablesize teilst. Aus einem Klartext entsteht ein Geheimtext durch .
Karteikasten
Erst selbst überlegen, dann umdrehen.
Übung mit Feedback