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.

Geschwindigkeitsvergleich: Angriffspotenzial
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.

bcrypt in Node.js
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.

Argon2 in Node.js
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()

Sicheres Hashing in PHP
// 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.