Bcrypt vs Argon2: Welcher Passwort-Hash im Jahr 2026
Bcrypt und Argon2 sind die beiden heute am häufigsten verwendeten Passwort-Hash-Funktionen. Beide sind so konzipiert, dass sie langsam und widerstandsfähig gegen Brute-Force-Angriffe sind, im Gegensatz zu MD5 oder SHA-256, die konstruktionsbedingt schnell sind. Argon2 hat 2015 den Password Hashing Competition gewonnen und ist nun die von der OWASP empfohlene Wahl für neue Anwendungen. Bcrypt bleibt eine ausgezeichnete, ausgereifte und weit verbreitete Wahl. Dieser Artikel erläutert die Unterschiede genau, damit Sie sich entscheiden können.
Warum ein Passwort-Hash anders ist
Eine klassische kryptografische Hash-Funktion wie SHA-256 ist darauf ausgelegt, schnell zu sein: Man möchte mehrere GB Daten pro Sekunde hashen. Für Passwörter ist diese Eigenschaft ein Nachteil: Ein Angreifer, der Ihre Benutzertabelle erbeutet, kann auf einer GPU Milliarden von Passwörtern pro Sekunde testen. Eine Passwort-Hash-Funktion (PHF, password hashing function) hat im Gegenteil folgende Ziele:
- Konstruktionsbedingt langsam, mit einem einstellbaren Kostenparameter
- Gesalzen, um Rainbow Tables und parallele Angriffe auf mehrere Konten zu verhindern
- Widerstandsfähig gegen spezialisierte Hardware (GPU, FPGA, ASIC), um den Geschwindigkeitsvorteil des Angreifers zu begrenzen
Der Salt und der Kostenparameter werden mit dem Hash gespeichert, in einer einzigen
Zeichenkette typischerweise in der Form $algo$params$salt$hash. So lassen sich die
Kosten im Laufe der Zeit erhöhen, ohne dass eine sofortige Migration der alten Hashes erzwungen wird.
Bcrypt: 1999, Blowfish, cost-Parameter
Bcrypt wurde 1999 von Niels Provos und David Mazières für OpenBSD entwickelt. Es
basiert auf dem Verschlüsselungsalgorithmus Blowfish und nutzt dessen hohe Initialisierungskosten der
Tabellen aus. Bcrypt bietet einen einzigen Parameter, cost (oder rounds),
der die Anzahl der Iterationen in Form von 2^cost definiert. Eine Erhöhung von cost um 1 verdoppelt
die Rechenzeit.
Typisches Ausgabeformat:
$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
| | | |
| | cost = 12 Salt + Hash in Base64
| Variante (2y = openbsd)
Algorithmus bcrypt
Bcrypt begrenzt die Eingabe auf 72 Byte: Ein längeres Passwort wird stillschweigend abgeschnitten, was eine bekannte Falle ist. Der übliche Ausweg besteht darin, das Passwort mit SHA-256 vorzuhashen und dann in Base64 zu kodieren, bevor bcrypt angewendet wird. Dies kann jedoch in einigen Implementierungen problematische Null-Bytes einführen. Argon2 hat diese Beschränkung nicht.
Argon2: 2015, PHC-Sieger, 3 Varianten
Argon2 wurde von Alex Biryukov, Daniel Dinu und Dmitry Khovratovich entwickelt. Es hat im Juli 2015 die Password Hashing Competition gewonnen und ist durch RFC 9106 (2021) standardisiert. Argon2 bietet drei Parameter:
- Memory cost (
m): verwendete Speichermenge in KiB - Time cost (
t): Anzahl der Iterationen über den Speicherblock - Parallelism (
p): Anzahl der parallelen Threads
Argon2 existiert in drei Varianten:
- Argon2d: datenabhängiger Speicherzugriff. Widerstandsfähiger gegen GPU-Angriffe, aber anfällig für Seitenkanalangriffe (Timing, Cache).
- Argon2i: datenunabhängiger Speicherzugriff. Widerstandsfähig gegen Seitenkanäle, etwas weniger widerstandsfähig gegen GPU-Angriffe.
- Argon2id: hybrid, startet im i-Modus und wechselt dann in den d-Modus. Standardmäßig empfohlen durch RFC 9106 und OWASP.
Die von OWASP für 2026 empfohlenen Parameter für Argon2id: m=19456 KiB (19 MiB),
t=2, p=1. Typisches Ausgabeformat:
$argon2id$v=19$m=19456,t=2,p=1$c2VsX2FsZWF0b2lyZQ$aGFzaF9jYWxjdWxl
| | | | |
| | Parameter Salt Base64 Hash Base64
| Version
Algorithmus argon2id
Warum Argon2id empfohlen wird
Die Widerstandsfähigkeit gegen spezialisierte Hardware ist heute das entscheidende Kriterium. Bcrypt verwendet wenig Speicher (~4 KiB), wodurch eine High-End-GPU Hunderttausende von Hashes pro Sekunde testen kann. Argon2id ist memory-hard: Mehrere MiB Speicher pro Versuch zu erzwingen, reduziert drastisch die auf einer GPU erreichbare Parallelität und macht das Design dedizierter ASICs wirtschaftlich unrentabel.
Der hybride Modus von Argon2id bietet zudem in der ersten Hälfte der Berechnung Schutz gegen Seitenkanalangriffe. Diese Kombination rechtfertigt seinen Platz als Standardempfehlung von OWASP, NIST SP 800-63B (seit der Revision 2024) und RFC 9106.
Vergleichstabelle
| Kriterium | Bcrypt | Argon2id |
|---|---|---|
| Jahr | 1999 | 2015 |
| Standardisierung | De facto, USENIX 1999 | RFC 9106 (2021) |
| Parameter | cost | memory, time, parallelism |
| Verwendeter Speicher | ~4 KiB | Konfigurierbar (~19 MiB empfohlen) |
| Memory-hard | Nein | Ja |
| GPU-Widerstand | Mäßig | Stark |
| Seitenkanal-Widerstand | Gut (constant-time) | Gut (id-Modus) |
| Eingabegrenze | 72 Byte | Keine |
| OWASP-Empfehlung 2026 | Akzeptabel | Bevorzugt |
| Ökosystem-Reife | Sehr breit | Breit seit ~2018 |
Leistung und Widerstand gegen Angriffe
Auf einem modernen Server benötigt ein bcrypt mit cost=12 etwa 250 ms und ein argon2id mit den OWASP-Parametern etwa 100-300 ms, je nach Maschine. Die absolute Zeit ist nicht das Kriterium: Entscheidend ist das Verhältnis zwischen Ihren Kosten (eine Berechnung pro Login) und denen des Angreifers (Milliarden von Berechnungen auf GPU, um einen Dump zu knacken).
Auf einer RTX 4090 erreicht hashcat etwa 200.000 bcrypt/s bei cost=12, gegenüber einigen Zehntausenden argon2id bei 19 MiB. Bei gleicher Rechenzeit auf der Serverseite verlangsamt Argon2id den Angreifer 5- bis 10-mal stärker als bcrypt, und der Abstand wächst mit den neuen GPU-Generationen.
PHP-Beispiele
PHP unterstützt beide nativ über password_hash() und password_verify() seit
PHP 7.2 für Argon2i (und 7.3 für Argon2id). Der PHP-Konstruktor verwaltet Salt und Format automatisch.
Bcrypt
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
$ok = password_verify($password, $hash);
if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) {
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
}
Argon2id
$opts = [
'memory_cost' => 19456, // 19 MiB
'time_cost' => 2,
'threads' => 1,
];
$hash = password_hash($password, PASSWORD_ARGON2ID, $opts);
$ok = password_verify($password, $hash);
if (password_needs_rehash($hash, PASSWORD_ARGON2ID, $opts)) {
$hash = password_hash($password, PASSWORD_ARGON2ID, $opts);
}
Sie können Hashes aller Typen mit unserem Hash-Generator erzeugen oder identifizieren und mit unserem Hash-Identifizierer.
Empfehlung
Für eine neue Anwendung im Jahr 2026 wählen Sie Argon2id mit den OWASP-Parametern
als Basis (m=19456, t=2, p=1), anzupassen an die Zielzeit
(typischerweise 250 bis 500 ms). Wenn Sie eine bestehende bcrypt-Anwendung pflegen, besteht keine
Eile zur Migration: bcrypt mit cost=12 oder höher bleibt 2026 sicher. Nutzen Sie ein
password_needs_rehash() beim nächsten Login, um aktive Benutzer schrittweise zu
Argon2id zu migrieren.
Vermeiden Sie unbedingt MD5, SHA-1 und nacktes SHA-256 für Passwörter (siehe unseren Vergleich MD5 vs SHA-256). Keiner dieser Algorithmen ist für diesen Zweck konzipiert.
Häufig gestellte Fragen
Ist Bcrypt im Jahr 2026 noch sicher?
Ja, sofern ein ausreichender cost verwendet wird (mindestens 12, wenn möglich 14). Bcrypt hat keine bekannte kryptografische Schwachstelle. Seine einzige Schwäche im Vergleich zu Argon2id ist sein geringer Speicherbedarf, der ihn anfälliger für GPU- und FPGA-Angriffe macht.
Sollte eine bcrypt-Datenbank zu Argon2id migriert werden?
Keine Eile. Eine schrittweise Migration mit password_needs_rehash() ist der
empfohlene Ansatz: Bei jedem erfolgreichen Login hashen Sie das Passwort in Argon2id neu. Nach
einigen Monaten sind die meisten aktiven Benutzer migriert, und Sie können für ruhende Konten
einen Reset erzwingen.
Wie viele Threads sind für Argon2id sinnvoll?
OWASP empfiehlt standardmäßig p=1. Eine Erhöhung von p bringt nichts,
wenn Ihr Webserver bereits viele Anfragen parallel verarbeitet, und erschwert das Tuning. Erhöhen
Sie stattdessen lieber m (Speicher), den wichtigsten Hebel für GPU-Widerstand.
Was ist ein „bcrypt decrypter"?
Es gibt keinen bcrypt-Entschlüssler: Die Funktion ist konstruktionsbedingt einseitig. Tools, die vorgeben, bcrypt zu „entschlüsseln", testen nur Wörterbücher gängiger Passwörter gegen den Hash. Das ist genau dasselbe wie ein Angreifer, der Ihre Tabelle hätte.
Argon2i oder Argon2id?
Argon2id in allen Fällen für Passwörter. Argon2i ist gegen Seitenkanäle etwas sicherer, aber schwächer gegen GPU-Angriffe. Argon2id kombiniert die Vorteile beider und wird von RFC 9106 ausdrücklich für das Passwort-Hashing empfohlen.
Sollte zusätzlich zum Salt ein Pepper verwendet werden?
Der Salt reicht für die große Mehrheit der Anwendungen aus. Ein Pepper (geheimer Schlüssel, der außerhalb der Datenbank gespeichert und als HMAC vor dem Hash verwendet wird) fügt eine zusätzliche Schicht hinzu, falls die Datenbank ohne Kompromittierung des Anwendungsservers ausläuft. Argon2id stellt dies nicht nativ bereit, es muss manuell zusammengesetzt werden.