Ein Datenleck, bei dem Benutzerpasswörter in die Hände von Angreifern gelangen, ist für jedes Unternehmen ein Super-GAU. Wenn diese Passwörter im Klartext gespeichert oder mit veralteten Algorithmen wie MD5 oder SHA-256 verarbeitet wurden, können Hacker Millionen von Accounts innerhalb von Sekunden knacken. Ein korrektes Passwort-Hashing ist die letzte und wichtigste Verteidigungslinie Ihrer Webanwendung.
Warum Klartext-Speicherung grob fahrlässig ist
Wenn Ihre Datenbank kompromittiert wird und die Passwörter unverschlüsselt vorliegen, ist der Schutz Ihrer Nutzer sofort verloren. Da viele Anwender dieselben Passwörter bei verschiedenen Diensten verwenden, führt ein einziger Vorfall bei Ihrem Dienst oft dazu, dass auch E-Mail-, Banking- oder Social-Media-Accounts Ihrer Nutzer übernommen werden.
Warum MD5 und SHA-256 für Passwörter ungeeignet sind
MD5, SHA-1 und SHA-256 sind allgemeine Hash-Funktionen. Sie wurden für Geschwindigkeit entwickelt – ein moderner Grafikprozessor (GPU) kann Milliarden von SHA-256-Hashes pro Sekunde berechnen. Bei Passwörtern ist genau diese Geschwindigkeit Ihr größter Feind.
Algorithmus Hashes/Sekunde (GPU) Zeit für 8-stelligen Angriff ───────────────────────────────────────────────────────────────────── MD5 200 Milliarden Sekunden SHA-256 10 Milliarden Minuten bcrypt (Cost 12) 5.000 Jahrtausende Argon2id 1.000 Millionen Jahre
Was macht eine moderne Hash-Funktion aus?
- Bewusste Verlangsamung: Ein Hash sollte etwa 100ms bis 500ms dauern. Das ist für einen Login-Vorgang vernachlässigbar, macht Brute-Force-Angriffe jedoch unmöglich.
- Einstellbarer Kostenfaktor: Mit steigender Rechenleistung der Hardware lässt sich der Sicherheitsfaktor flexibel anpassen.
- Integrierter Salt: Durch einen zufälligen Salt erzeugt dasselbe Passwort bei zwei Nutzern völlig unterschiedliche Hashes.
- Memory-Hardness: Moderne Verfahren benötigen viel Arbeitsspeicher, was den Einsatz von spezialisierten GPU-Angriffen massiv erschwert.
Die Top 3: bcrypt, scrypt und Argon2id
bcrypt (1999)
Der bewährte Industriestandard der letzten zwei Jahrzehnte. Er ist zwar nicht "memory-hard", bietet aber dennoch einen sehr soliden Schutz gegen moderne Angriffe.
import bcrypt from 'bcryptjs';
// Passwort hashen (Cost-Faktor 12 — ca. 300ms)
const hash = await bcrypt.hash("DeinSicheresPasswort123", 12);
// → "$2b$12$LJ3m4ys3Lz7g..."
// Passwort verifizieren
const isValid = await bcrypt.compare("DeinSicheresPasswort123", hash);
// → true
Argon2id (2015 — Unsere Empfehlung)
Der Gewinner des "Password Hashing Competition". Argon2id ist der aktuelle Goldstandard, da er sowohl CPU- als auch speicherintensiv ist. Er bietet die höchste Resistenz gegen GPU-basierte Angriffe.
import argon2 from 'argon2';
// Passwort hashen
const hash = await argon2.hash("DeinSicheresPasswort123", {
type: argon2.argon2id, // Empfohlene Variante
memoryCost: 65536, // 64 MB Arbeitsspeicher
timeCost: 3, // 3 Iterationen
parallelism: 4 // 4 Threads
});
// Verifizieren
const isValid = await argon2.verify(hash, "DeinSicheresPasswort123");
PHP: Die native Funktion password_hash()
// Hashen — nutzt standardmäßig bcrypt oder Argon2id ab PHP 7.3+
$hash = password_hash("DeinSicheresPasswort123", PASSWORD_ARGON2ID);
// Verifizieren
if (password_verify("DeinSicheresPasswort123", $hash)) {
echo "Login erfolgreich!";
}
// Prüfung: Ist ein Rehash nötig (z.B. bei gestiegenen Sicherheitsanforderungen)?
if (password_needs_rehash($hash, PASSWORD_ARGON2ID)) {
$neuerHash = password_hash("DeinSicheresPasswort123", PASSWORD_ARGON2ID);
// Datenbank-Eintrag aktualisieren
}
Die Rolle des "Salt"
Ein Salt ist ein zufälliger Wert, der vor dem Hashing mit dem Passwort kombiniert wird. Ohne Salt hätten identische Passwörter identische Hash-Werte, was Rainbow-Table-Angriffe ermöglicht. Moderne Bibliotheken wie die genannten handhaben das Salting vollautomatisch, sodass Sie sich um die Verwaltung der Zufallswerte nicht manuell kümmern müssen.
Best Practices für Ihre Sicherheit
- Nutzen Sie Argon2id für neue Projekte. Greifen Sie auf bcrypt zurück, falls dies nicht unterstützt wird.
- Vermeiden Sie MD5, SHA-1 oder SHA-256 für die Passwortspeicherung unter allen Umständen.
- Programmieren Sie niemals eigene Krypto-Algorithmen. Nutzen Sie etablierte Bibliotheken.
- Erhöhen Sie regelmäßig den Kostenfaktor, um mit der Hardwareentwicklung Schritt zu halten.
- Implementieren Sie Rate-Limiting an Login-Schnittstellen, um automatisierte Brute-Force-Versuche zu blockieren.
- Maximale Länge: Erlauben Sie lange Passwörter (mind. 64 Zeichen) und setzen Sie keine künstlich niedrigen Limits.
- Pepper: Erwägen Sie die Verwendung eines "Peppers" – ein zusätzlicher, geheimer Schlüssel, der getrennt von der Datenbank gespeichert wird.
Entdecken Sie unsere kostenlosen Entwickler-Tools
Nutzen Sie unsere Encoder und Decoder für Base64, essenziell für die Implementierung von Authentifizierungs-Headern.