Hashing erklärt: MD5, SHA und wann du welches verwendest
Hash-Funktionen verwandeln Daten in Fingerabdrücke. Hier erfährst du, wie sie funktionieren und warum MD5 noch nicht tot ist.
Du lädst eine Datei herunter. Die Website zeigt eine MD5-Prüfsumme. Du sollst sie irgendwie verifizieren. Aber warum? Und was ist der Unterschied zwischen MD5 und SHA-256?
Hash-Funktionen sind überall in Software. Sie zu verstehen hilft dir, sie korrekt zu verwenden.
Was Hashing macht
Eine Hash-Funktion nimmt beliebige Eingaben und produziert eine Ausgabe fester Größe. Immer dieselbe Ausgabe für dieselbe Eingabe. Ändere ein Bit der Eingabe, und die Ausgabe ändert sich komplett.
"hello" → 5d41402abc4b2a76b9719d911017c592 (MD5)
"Hello" → 8b1a9953c4611296a827abf8c47804d7 (MD5)
Ein Großbuchstabe ändert den gesamten Hash. Das ist der Punkt.
Hash vs. Verschlüsselung
Hashing ist einseitig. Du kannst einen Hash nicht umkehren, um die Originaldaten zu bekommen.
Verschlüsselung ist zweiseitig. Mit dem richtigen Schlüssel kannst du entschlüsseln und das Original wiederherstellen.
Wenn jemand sagt, er könne einen MD5-Hash „entschlüsseln", crackt er ihn entweder (probiert Eingaben aus, bis eine passt) oder er ist verwirrt darüber, wie Hashing funktioniert.
Die gängigen Algorithmen
MD5 - 128-Bit-Ausgabe. Schnell, aber kryptographisch gebrochen. OK für Prüfsummen, nicht für Sicherheit.
SHA-1 - 160-Bit. Auch für kryptographische Nutzung gebrochen. Legacy-Systeme verwenden es noch.
SHA-256 - 256-Bit. Aktueller Standard. Verwende das, wenn Sicherheit wichtig ist.
SHA-512 - 512-Bit. Etwas sicherer, manchmal schneller auf 64-Bit-Systemen.
BLAKE2/BLAKE3 - Moderne Alternativen. Schneller als SHA-256 mit ähnlicher Sicherheit.
Wann MD5 in Ordnung ist
MD5 bekommt einen schlechten Ruf, weil es „gebrochen" ist. Aber für Kryptographie gebrochen bedeutet nicht nutzlos.
Dateiintegritätsprüfungen. Verifizieren, dass ein Download nicht beschädigt wurde. Ein Angreifer müsste eine bösartige Datei mit demselben Hash erstellen, was mehr Aufwand erfordert, als die meisten Angriffe wert sind für Nicht-Sicherheitskontexte.
Cache-Schlüssel. Inhalte hashen, um eindeutige Identifikatoren zu generieren. Keine Sicherheitsimplikationen.
Deduplizierung. Doppelte Dateien durch Hash-Vergleich finden.
Wann du SHA-256 oder besser verwenden solltest
Passwortspeicherung. Eigentlich, verwende bcrypt oder Argon2 stattdessen. Sie sind für Passwörter designt.
Digitale Signaturen. Dokumentenintegrität, wo Angreifer Fälschungen versuchen könnten.
Alles sicherheitskritische. Wenn ein Angreifer Anreiz hat, Kollisionen zu finden.
Das Kollisionsproblem
Eine Kollision ist, wenn zwei verschiedene Eingaben denselben Hash produzieren. Geburtstags-Mathematik sagt, dass Kollisionen wahrscheinlicher werden, als du erwarten würdest.
Für MD5 haben Forscher Wege gefunden, absichtliche Kollisionen zu erzeugen. Zwei verschiedene Dateien, derselbe Hash. Deshalb ist es „gebrochen".
Für SHA-256 existieren keine praktischen Kollisionsangriffe. Noch nicht.
Praktische Beispiele
Downloads verifizieren:
sha256sum ubuntu.iso
# Ausgabe mit Hash auf Download-Seite vergleichen
API-Schlüssel speichern: Speichere den Hash, nicht den eigentlichen Schlüssel. Wenn Nutzer einen Schlüssel einreichen, hashe ihn und vergleiche.
Git-Commits:
Git verwendet SHA-1, um Commits zu identifizieren. Deshalb sehen Commit-Hashes aus wie a1b2c3d4e5f6...
Erfinde nichts Eigenes
Erfinde niemals dein eigenes Hashing-Schema. „MD5 zweimal" oder „SHA-256 mit angehängtem Salt" sind schlechter als etablierte Muster zu verwenden.
Für Passwörter: bcrypt, scrypt oder Argon2. Für Integrität: SHA-256. Für Geschwindigkeit: BLAKE3.
Die Experten haben das bereits herausgefunden.
Hash-Funktionen sind konzeptionell einfach, aber nuanciert in der Anwendung. Wähle den richtigen Algorithmus für den Job und verwende kein kryptographisches Hashing, wo eine einfache Prüfsumme ausreichen würde.