Kryptographische Hash-Funktionen
In dieser Lektion betrachten wir kryptographische Hash-Funktionen, die in der schnellen Validierung und Authentifizierung weit verbreitet sind.
Am Ende der Lektion haben wir folgende Themen behandelt:
- Was kryptographische Hash-Funktionen sind
- Python-Codebeispiele zur Veranschaulichung der Verwendung von Hash-Funktionen
- Anwendungen des kryptographischen Hashings
- Die Sicherheit des kryptographischen Hashings
- Bedrohungen dieser Algorithmen durch klassische und Quantencomputer
Einführung in das kryptographische Hashing
Hash-Funktionen stellen ein wertvolles Konstrukt in der Kryptographie dar, da sie Validierung mit Vertraulichkeit verbinden. Als solche bilden Hash-Funktionen einen wichtigen Bestandteil von Mechanismen zur Datenauthentifizierung und Integrität, wie hash-basierte Nachrichtenauthentifizierungscodes (HMAC) und digitale Signaturen. Dieser Artikel erläutert die grundlegenden Ideen und Sicherheitsüberlegungen hinter kryptographischen Hash-Funktionen und skizziert potenzielle Schwachstellen durch das Aufkommen von Quantencomputing.
Grundlegende Konzeption und Gestaltung von Hash-Funktionen
Es gibt viele Situationen, in denen Authentifizierung und Integritätsprüfung kostengünstig und ohne Preisgabe privater Informationen an die prüfende Partei durchgeführt werden müssen.
Beim Herunterladen von Software von einem entfernten Server wird beispielsweise ein effizienter Mechanismus benötigt, um zu überprüfen, ob die heruntergeladene Software seit ihrer Erstellung durch den Originalautor nicht verändert wurde. Ebenso wäre es bei der Authentifizierung von Benutzern in Webanwendungen wünschenswert, einen Mechanismus zu verwenden, der weder die physische Speicherung noch die Übertragung der eigentlichen Passwörter erfordert, was deren Vertraulichkeit potenziell gefährden kann.
Kryptographische Hash-Funktionen (CHFs) begegnen diesen Anforderungen effizient und sicher.
Im Wesentlichen nimmt eine kryptographische Hash-Funktion eine Eingabe (oder Nachricht) beliebiger Länge entgegen und gibt eine Zeichenkette fester Länge von n Bits aus. Die Ausgabe einer CHF wird auch als Digest bezeichnet.
Eine nützliche CHF sollte mehrere wichtige Eigenschaften erfüllen:
- Gleichmäßigkeit: Die von einer CHF erzeugten Digests sollten gleichmäßig verteilt sein und zufällig wirken. Das Ziel ist sicherzustellen, dass die Ausgabe keine Informationen über die Eingabe preisgibt.
- Determinismus: Für eine gegebene Eingabe muss eine CHF stets denselben Digest erzeugen, d. h., sie muss deterministisch sein.
- Irreversibilität: Eine CHF ist eine Einwegfunktion: Aus einem gegebenen Digest soll es praktisch unmöglich sein, das Hashing umzukehren und die Eingabe zu rekonstruieren.
- Näherungsweise Injektivität: Obwohl CHFs Viele-zu-Eins-Funktionen sind, sollen sie wie Eins-zu-Eins-Funktionen wirken. Dies wird durch eine enorm große Ausgabemenge in Kombination mit dem Lawineneffekt erreicht, bei dem kleine Änderungen in der Eingabe zu sehr unterschiedlichen Digests führen. Diese Eigenschaft wird als näherungsweise Injektivität bezeichnet.
Auf dieser Basis lässt sich ein Datenstück gegen die Originalversion validieren, indem ein Digest der Daten mit einem Digest des Originals verglichen wird.
- Stimmen die beiden Digests überein, kann mit hoher Wahrscheinlichkeit davon ausgegangen werden, dass die Daten mit dem Original identisch sind.
- Weichen die Digests voneinander ab, ist sicher, dass die Daten manipuliert wurden oder anderweitig nicht authentisch sind.
Da die CHF-Digests selbst den tatsächlichen Inhalt der Daten oder des Originals nicht preisgeben, ermöglichen sie eine Validierung unter Wahrung der Privatsphäre.
Mathematical description
Eine Hash-Funktion kann wie folgt definiert werden: