MD5 vs SHA-256: Welchen Hash-Algorithmus solltest du verwenden?
Die Wahl des falschen Hash-Algorithmus kann dein System Kollisionsangriffen, Datenkorruption oder unnötigem Performance-Overhead aussetzen. Dieser Leitfaden vergleicht die vier am häufigsten verwendeten Hash-Algorithmen mit einem klaren Entscheidungsrahmenwerk.
Was ist eine Hash-Funktion?
Eine kryptografische Hash-Funktion nimmt beliebige Eingabedaten und erzeugt eine Ausgabe fester Größe (den „Digest” oder „Hash”). Gute Hash-Funktionen haben drei Eigenschaften:
- Deterministisch: Die gleiche Eingabe erzeugt immer die gleiche Ausgabe.
- Einweg: Der Hash kann nicht umgekehrt werden, um die ursprüngliche Eingabe wiederherzustellen.
- Kollisionsresistent: Es sollte rechnerisch unmöglich sein, zwei verschiedene Eingaben zu finden, die den gleichen Hash erzeugen.
Wenn Eigenschaft Nr. 3 bricht, gilt der Algorithmus als „kryptografisch gebrochen”. Genau das ist mit MD5 und SHA-1 passiert.
Algorithmen-Vergleich auf einen Blick
| Eigenschaft | MD5 | SHA-1 | SHA-256 | SHA-512 |
|---|---|---|---|---|
| Ausgabegröße | 128 Bits (32 Hex-Zeichen) | 160 Bits (40 Hex-Zeichen) | 256 Bits (64 Hex-Zeichen) | 512 Bits (128 Hex-Zeichen) |
| Blockgröße | 512 Bits | 512 Bits | 512 Bits | 1024 Bits |
| Eingeführt | 1991 | 1995 | 2001 | 2001 |
| Entwickler | Ron Rivest | NSA / NIST | NSA / NIST | NSA / NIST |
| Kollisionsresistenz | Gebrochen (2004) | Gebrochen (2017) | Sicher | Sicher |
| Geschwindigkeit (relativ) | Am schnellsten | Schnell | Mittel | Mittel (schneller auf 64-Bit) |
| NIST-Status | Veraltet | Veraltet | Empfohlen | Empfohlen |
MD5: Schnell, aber gebrochen
MD5 (Message-Digest Algorithm 5) wurde 1991 von Ronald Rivest entworfen und wurde in den 1990er- und frühen 2000er-Jahren zum De-facto-Standard für Prüfsummen. Er erzeugt einen 128-Bit-Hash in 32 Hexadezimalzeichen.
Warum MD5 gebrochen ist
2004 demonstrierte Xiaoyun Wang praktische Kollisionsangriffe gegen MD5. Bis 2008 erzeugten Forscher ein gefälschtes SSL-Zertifikat mittels MD5-Kollisionen, was bewies, dass der Angriff nicht nur theoretisch war. Heute können MD5-Kollisionen in Sekunden auf Consumer-Hardware erzeugt werden.
// MD5-Hash erzeugen (nur für nicht-sicherheitsrelevante Nutzung)
// Die Web Crypto API ist für MD5 nicht verfügbar — verwende eine Bibliothek
import { md5 } from 'hash-wasm';
const hash = await md5('Hello, World!');
console.log(hash);
// → 'bea8252ff4e80f41719ea13cdf007273' (32 Hex-Zeichen)
Wann MD5 noch akzeptabel ist
Obwohl kryptografisch gebrochen, bleibt MD5 für nicht-sicherheitsrelevante Anwendungen nützlich:
- Datei-Deduplizierung: Doppelte Dateien in Speichersystemen erkennen
- Cache-Schlüssel: Kurze, deterministische Schlüssel für Cache-Lookups erzeugen
- Datenintegritäts-Prüfsummen: Schnelle Überprüfung, ob Daten nicht versehentlich beschädigt wurden (nicht absichtlich manipuliert)
- Legacy-Systemkompatibilität: Zusammenarbeit mit älteren Systemen, die MD5 erfordern
Die Unterscheidung: MD5 schützt gegen versehentliche Beschädigung, nicht gegen absichtliche Manipulation.
SHA-1: Veraltet, aber noch vorhanden
SHA-1 (Secure Hash Algorithm 1) wurde von der NSA entworfen und 1995 vom NIST veröffentlicht. Er erzeugt einen 160-Bit-Hash in 40 Hexadezimalzeichen.
2017 demonstrierten Google und CWI Amsterdam die erste praktische SHA-1-Kollision (der „SHAttered”-Angriff) und erzeugten zwei verschiedene PDF-Dateien mit dem gleichen SHA-1-Hash. Große Browser und Zertifizierungsstellen hatten bereits ab 2016 begonnen, SHA-1-Zertifikate abzulehnen.
SHA-1 nur noch für Kompatibilität mit Systemen verwenden, die es erfordern (z. B. Git verwendet SHA-1 für Commit-Hashes, stellt aber auf SHA-256 um). Für neue Projekte SHA-256 oder stärker wählen.
SHA-256: Der aktuelle Standard
SHA-256 ist Teil der SHA-2-Familie, von der NSA entworfen und 2001 vom NIST veröffentlicht. Er erzeugt einen 256-Bit-Hash in 64 Hexadezimalzeichen. Stand 2026 ist er der empfohlene Algorithmus für praktisch alle Hashing-Anforderungen.
// SHA-256-Hash mit der Web Crypto API erzeugen (browser-nativ)
async function sha256(text) {
const data = new TextEncoder().encode(text);
const hash = await crypto.subtle.digest('SHA-256', data);
return Array.from(new Uint8Array(hash))
.map(b => b.toString(16).padStart(2, '0'))
.join('');
}
const hash = await sha256('Hello, World!');
console.log(hash);
// → 'dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f'
Warum SHA-256 die Standardwahl ist
- Keine bekannten Angriffe: Stand 2026 existieren keine praktischen Kollisions- oder Preimage-Angriffe
- Browser-nativ: Über die Web Crypto API in allen modernen Browsern verfügbar, keine Bibliotheken nötig
- Industriestandard: Verwendet für TLS-Zertifikate, Bitcoin, Paketmanager (npm, pip), Docker-Image-Digests
- NIST-geprüft: Empfohlen für alle sicherheitsrelevanten Anwendungen
SHA-512: Wenn du mehr brauchst
SHA-512 erzeugt einen 512-Bit-Hash in 128 Hexadezimalzeichen. Er verwendet eine 1024-Bit-Blockgröße (vs. 512 Bits bei SHA-256), was ihn auf 64-Bit-Prozessoren schneller als SHA-256 macht, da er mehr Daten pro Zyklus verarbeitet.
# Python: SHA-512 ist genauso einfach wie SHA-256
import hashlib
hash_256 = hashlib.sha256(b'Hello, World!').hexdigest()
hash_512 = hashlib.sha512(b'Hello, World!').hexdigest()
print(f"SHA-256: {hash_256}") # 64 Zeichen
print(f"SHA-512: {hash_512}") # 128 Zeichen
Verwende SHA-512, wenn:
- Du eine größere Sicherheitsmarge brauchst (256-Bit-Kollisionsresistenz vs. 128-Bit bei SHA-256)
- Deine Plattform 64-Bit ist und Performance wichtig ist (SHA-512 kann 1,5x schneller als SHA-256 auf x86-64 sein)
- Das Protokoll oder die Spezifikation es erfordert (einige Zertifikatsschemata, spezifische Compliance-Anforderungen)
Für die meisten Anwendungen reicht SHA-256 aus. Die zusätzliche Länge von SHA-512-Hashes verdoppelt Speicher und Bandbreite ohne praktischen Sicherheitsvorteil für typische Anwendungsfälle.
Entscheidungsrahmenwerk: Welchen Hash verwenden
Für Dateiintegrität und Prüfsummen
SHA-256. Der Standard für die Verifizierung von Downloads, den Vergleich von Dateiinhalten und die Prüfung, ob Daten beschädigt wurden. SHA-256 ist der direkte Nachfolger von MD5 in bestehenden Systemen.
# Integrität eines Downloads prüfen
sha256sum downloaded-file.tar.gz
# Ausgabe mit dem veröffentlichten Hash vergleichen
Für Passwortspeicherung
Weder MD5 noch SHA-256 direkt verwenden. Allgemeine Hash-Funktionen sind zu schnell für Passwort-Hashing. Ein Angreifer kann Milliarden von Versuchen pro Sekunde durchführen. Verwende stattdessen einen dedizierten Passwort-Hashing-Algorithmus:
| Algorithmus | Status | Hinweise |
|---|---|---|
| Argon2id | Empfohlen | Gewinner des Password Hashing Competition 2015; speicherintensiv |
| bcrypt | Gut | Weit verbreitet; eingebauter Salt; einstellbarer Arbeitsfaktor |
| scrypt | Gut | Speicherintensiv; in einigen Kryptowährungssystemen verwendet |
| PBKDF2 | Akzeptabel | NIST-geprüft, aber nicht speicherintensiv; verwende ≥600.000 Iterationen |
| SHA-256 | Unzureichend | Zu schnell; kein eingebauter Salt; anfällig für GPU-Angriffe |
| MD5 | Gefährlich | Gebrochen + zu schnell; trivial knackbar |
// FALSCH: Passwörter nicht mit SHA-256 hashen
const hash = await sha256(password); // Knackbar bei Milliarden/s
// RICHTIG: Verwende bcrypt (Node.js-Beispiel)
import bcrypt from 'bcrypt';
const hash = await bcrypt.hash(password, 12); // 12 Runden = ~250ms
const isValid = await bcrypt.compare(input, hash);
Für HMAC und Nachrichtenauthentifizierung
Verwende SHA-256 mit HMAC. HMAC (Hash-based Message Authentication Code) kombiniert eine Hash-Funktion mit einem geheimen Schlüssel, um sowohl Integrität als auch Authentizität zu verifizieren:
// HMAC-SHA256 für Webhook-Signatur-Verifizierung
async function verifyWebhook(payload, signature, secret) {
const key = await crypto.subtle.importKey(
'raw', new TextEncoder().encode(secret),
{ name: 'HMAC', hash: 'SHA-256' }, false, ['verify']
);
const sig = Uint8Array.from(atob(signature), c => c.charCodeAt(0));
return crypto.subtle.verify('HMAC', key, sig, new TextEncoder().encode(payload));
}
Für inhaltsadressierte Speicherung
SHA-256. Git, Docker und IPFS verwenden alle inhaltsadressierte Speicherung, bei der der Hash des Inhalts als seine Adresse dient. SHA-256 bietet ausreichende Kollisionsresistenz, um Eindeutigkeit über Milliarden von Objekten zu garantieren.
Performance-Benchmarks
Relative Hashing-Geschwindigkeit auf einem modernen x86-64-Prozessor (höher = schneller):
| Algorithmus | Durchsatz (MB/s) | Relative Geschwindigkeit |
|---|---|---|
| MD5 | ~3.200 | 1,0x (Baseline) |
| SHA-1 | ~2.400 | 0,75x |
| SHA-256 | ~1.500 | 0,47x |
| SHA-512 | ~2.100 | 0,66x |
Hinweis: SHA-512 ist schneller als SHA-256 auf 64-Bit-Prozessoren aufgrund seines breiteren internen Zustands. Auf 32-Bit-Systemen kehrt sich die Situation um. Für die meisten Anwendungen ist der Geschwindigkeitsunterschied irrelevant. Das Hashen einer 1-MB-Datei dauert unter 1 ms mit jedem dieser Algorithmen.
Häufige Fehler vermeiden
1. MD5 für Sicherheit verwenden
MD5-Kollisionen lassen sich trivial erzeugen. Verwende MD5 niemals für digitale Signaturen, Zertifikatsvalidierung oder Szenarien, in denen ein Angreifer bösartige Eingaben erstellen könnte.
2. Passwörter mit SHA-256 hashen
SHA-256 ist kein Passwort-Hash. Er ist zu schnell, hat keinen eingebauten Salt und ist anfällig für Rainbow-Table- und GPU-beschleunigte Brute-Force-Angriffe. Verwende Argon2id oder bcrypt. Die Mathematik hinter Brute-Force-Resistenz erklärt unser Artikel zur Passwort-Entropie.
3. Hash-Länge mit Sicherheit gleichsetzen
Ein 512-Bit-Hash ist nicht automatisch „sicherer” als ein 256-Bit-Hash in Bezug auf Kollisionsresistenz. Die Sicherheitsmarge von SHA-256 (128-Bit-Kollisionsresistenz) liegt bereits weit jenseits der Brute-Force-Fähigkeit. Wähle basierend auf deinen tatsächlichen Anforderungen, nicht der Hash-Länge.
4. Eigene Hash-Kombinationen basteln
Muster wie SHA256(MD5(data)) oder MD5(data + salt) reparieren einen gebrochenen Algorithmus nicht auf magische Weise. Verwende einen einzelnen, gut geprüften Algorithmus (SHA-256) oder eine korrekte Konstruktion (HMAC).
Selbst ausprobieren
Siehe auch: Hash-Generator (MD5, SHA-1, SHA-256, SHA-512 im Browser) | Web-Sicherheits-Leitfaden | Entwickler-Werkzeuge
Häufig gestellte Fragen
Ist MD5 noch sicher für Prüfsummen?
MD5 ist sicher für die Erkennung versehentlicher Dateibeschädigung. Wenn eine Datei beim Download beschädigt wird, ändert sich der MD5-Hash mit hoher Wahrscheinlichkeit. Allerdings ist MD5 nicht sicher gegen absichtliche Manipulation, da ein Angreifer eine modifizierte Datei mit dem gleichen MD5-Hash erstellen kann. Für Integritätsverifizierung, bei der Gegner ein Thema sind (z. B. Softwareverteilung), verwende stattdessen SHA-256.
Wie viel langsamer ist SHA-256 im Vergleich zu MD5?
SHA-256 ist ungefähr 2x langsamer als MD5 im Rohdurchsatz. Auf moderner Hardware hasht MD5 mit etwa 3.200 MB/s, während SHA-256 etwa 1.500 MB/s schafft. In der Praxis ist dieser Unterschied für die meisten Anwendungen vernachlässigbar. Das Hashen einer 100-MB-Datei dauert etwa 70 ms mit SHA-256. Der Performance-Unterschied wird nur bei sehr hohem Durchsatz relevant, wie Netzwerk-Paketinspektion oder Speicher-Deduplizierung im großen Maßstab.
Soll ich SHA-256 oder SHA-512 für meine Anwendung verwenden?
Verwende SHA-256 für die meisten Anwendungen. Es bietet 128-Bit-Kollisionsresistenz, was weit jenseits der Brute-Force-Fähigkeit liegt. Wähle SHA-512, wenn: (a) deine Plattform 64-Bit ist und du maximalen Durchsatz brauchst, (b) eine Spezifikation oder Compliance-Anforderung es vorschreibt, oder (c) du eine größere Sicherheitsmarge für langfristige Datenintegrität wünschst. Die zusätzliche Hash-Länge von SHA-512 verdoppelt den Speicher und ist selten nötig.
Kann SHA-256 geknackt oder umgekehrt werden?
SHA-256 kann nicht umgekehrt werden. Es ist eine Einweg-Funktion. Stand 2026 existieren keine praktischen Preimage- oder Kollisionsangriffe gegen SHA-256. Der beste bekannte Angriff erfordert 2^128 Operationen für Kollisionen, was mit aktueller oder absehbarer Technologie rechnerisch nicht machbar ist. SHA-256 ist vom NIST geprüft und wird in kritischer Infrastruktur eingesetzt, einschließlich TLS, Bitcoin und staatlichen Systemen.
Warum verwenden manche Systeme noch MD5, wenn es gebrochen ist?
Legacy-Kompatibilität ist der Hauptgrund. Viele bestehende Systeme, Protokolle und Dateiformate wurden um MD5 herum konzipiert, bevor seine Schwächen entdeckt wurden. Die Migration erfordert koordinierte Änderungen über alle Komponenten hinweg. Für nicht-sicherheitsrelevante Anwendungen wie Cache-Schlüssel und Deduplizierung machen MD5’s Geschwindigkeitsvorteil und kürzere Ausgabe es zu einer pragmatischen Wahl, wenn Kollisionsangriffe kein Bedrohungsmodell-Thema sind.