Hash-Funktionen (SHA-256)
Erstmal einfach — Was ist ein Hash, in einem Satz?
Stell dir einen Mixer vor: Du wirfst irgendwas rein (ein Wort, ein Buch, einen Film) und raus kommt immer ein gleich großer, bunter Smoothie. Gleiche Zutaten → gleicher Smoothie. Eine winzige andere Zutat → komplett anderer Smoothie. Und das Wichtigste: aus dem Smoothie kannst du die Zutaten nicht zurückbekommen.
Genau das macht eine Hash-Funktion mit Daten — sie erzeugt einen „Fingerabdruck", der immer gleich groß ist, egal wie groß die Eingabe.
Etwas formaler: eine Hash-Funktion macht aus einem beliebig langen Text einen Fingerabdruck fester Länge. SHA-256 liefert immer 256 Bit (= 64 Hex-Zeichen). Drei zentrale Eigenschaften: deterministisch, einweg (nicht umkehrbar) und kollisionsresistent (zwei verschiedene Eingaben sollten praktisch nie denselben Hash ergeben).
Warum eigentlich? — Warum braucht man das überhaupt?
Stell dir vor, eine Website speichert dein Passwort im Klartext. Wenn die Datenbank geklaut wird, kennen die Angreifer dein Passwort — und wahrscheinlich auch dein E-Mail-Passwort, weil viele Leute Passwörter wiederverwenden.
Speichert die Website stattdessen nur den Hash, kann sie beim Login prüfen „ergibt das eingegebene Passwort denselben Hash?" — ohne das Passwort selbst je zu kennen. Bei einem Datenleck haben die Angreifer nur die Fingerabdrücke, nicht die Originale.
Dieselbe Idee löst noch mehr Probleme: „Wurde diese Datei unterwegs verändert?", „Sind diese zwei Dokumente identisch, ohne dass ich sie beide herumschicken muss?", „Wie verkette ich Blöcke fälschungssicher zu einer Blockchain?"
Tiefer rein — Warum genau die Hälfte? (Avalanche, formal)
Eine ideale kryptografische Hash-Funktion verhält sich wie eine zufällige Orakel-Funktion: jedes Bit der Ausgabe ist mit Wahrscheinlichkeit 50 % gesetzt, unabhängig von der Eingabe. Ändert sich auch nur ein Eingabe-Bit, kippt jedes Ausgabe-Bit mit Wahrscheinlichkeit 50 % — das ist das Strict Avalanche Criterion (SAC).
In Hex-Zeichen umgerechnet: zwei zufällige Hashes stimmen pro Zeichen nur mit Wahrscheinlichkeit 1/16 überein. Erwartete Übereinstimmung bei 64 Zeichen: 4 — also rund 94 % unterschiedlich. Genau das siehst du oben.
Eigenschaften im Überblick
- Deterministisch: Gleiche Eingabe → immer gleicher Hash.
- Einweg: Aus dem Hash lässt sich die Eingabe nicht zurückrechnen – nur durch Raten (Brute-Force).
- Kollisionsresistent: Es ist praktisch unmöglich, zwei verschiedene Eingaben mit demselben Hash zu finden.
- Schnell zu berechnen: Aber für Passwörter nimmt man absichtlich langsame Varianten (bcrypt, scrypt, Argon2).
Häufiger Denkfehler — „Aber 2²⁵⁶ Möglichkeiten sind doch unknackbar…“
Stimmt für direktes Erraten — aber nicht für Kollisionen. Dank des Geburtstagsparadoxons brauchst du nur etwa √(2²⁵⁶) = 2¹²⁸ Versuche, um irgendeine Kollision zu finden. Das ist immer noch astronomisch viel, aber halb so viele Bits wie naiv gedacht.
Deshalb gilt die Faustregel: ein n-Bit-Hash bietet nur n/2 Bit Kollisionssicherheit. Genau aus diesem Grund ist SHA-1 (160 Bit → 80 Bit Sicherheit) heute zu schwach.
Tiefer rein — Wie ist SHA-256 innen aufgebaut?
SHA-256 gehört zur Familie der Merkle–Damgård-Konstruktionen: die Eingabe wird gepaddet, in 512-Bit-Blöcke geteilt, und jeder Block wird zusammen mit dem bisherigen Zustand durch eine Kompressionsfunktion geschickt. Die besteht aus 64 Runden mit Bit-Rotationen, XORs, modularen Additionen und festen Konstanten (abgeleitet aus den Kubikwurzeln von Primzahlen).
Die Konstruktion hat eine bekannte Schwäche: Length-Extension. Aus H(secret ‖ msg) kann ein Angreifer H(secret ‖ msg ‖ padding ‖ extra) berechnen, ohne das Secret zu kennen. Lösung: HMAC statt nackter Hash.
Warum eigentlich? — Warum für Passwörter ein „langsamer“ Hash?
SHA-256 ist mit Absicht schnell — eine moderne GPU rechnet Milliarden pro Sekunde. Genau das wollen Angreifer beim Brute-Forcengeleakter Passwort-Datenbanken. Algorithmen wie Argon2, scrypt oder bcrypt sind absichtlich langsam und brauchen viel Speicher, damit massenhaftes Raten unbezahlbar wird.
Plus Salt: ein zufälliger Wert pro Passwort sorgt dafür, dass zwei Nutzer mit demselben Passwort trotzdem unterschiedliche Hashes haben — Rainbow Tables nutzlos.
Geschichte — Wie alt ist SHA-256?
SHA-256 wurde 2001 von der NSA entworfen und vom NIST standardisiert (FIPS 180-2), als Teil der SHA-2-Familie. Vorgänger SHA-1 (1995) wurde 2017 öffentlichkeitswirksam gebrochen, als Google die erste praktische Kollision (SHAttered) demonstrierte. SHA-2 gilt weiterhin als sicher; daneben existiert seit 2015 SHA-3 mit einer ganz anderen Konstruktion (Keccak-Schwamm).