Was macht eine Speicherform wiederherstellbar
Vier Speicherformate, nach Wiederherstellbarkeit gerankt:
| Format | Wiederherstellbar? | Beispiel | Wiederherstellungs Methode |
|--------|-------------|---------|-----------------|
| Klartext | Ja | password: hunter2 | Datei lesen |
| Base64 | Ja | cGFzc3dvcmQ= | base64 --decode |
| Umkehrbare Ziffernfolge (AES) | Ja | ENC[AES256:...] | Verschlüsseln mit Schlüssel |
| Einweg-Hash (bcrypt) | Nein | $2b$12$... | Kann nicht rückgängig gemacht werden; muss durch Brute-Force |
Klartext, Base64 und umkehrbare Ziffernfolge: Alle wiederherstellbar. Eine einzelne Angriffsdump gibt einem Angreifer alle Kennwörter im Klartext, für alle Benutzer, gleichzeitig. Ein Einsturz; totale Exposition.
Der Mailman 2.x Beispiel
Mailman 2.x (GNU-Mailingliste-Manager): Speicherte Benutzerpasswörter im Klartext. Monatliche Passwort-Erinnerungs-E-Mail: Sand alle Abonnenten ihr Passwort im Klartext. Zwei getrennte Mängel, beide MOAD-0006:
1. Speicher: Klartext in der Liste-Datenbank. Ein Serververstoß zeigt alle Abonnentenpasswörter.
2. Übertragung: Monatliche E-Mail sendet das Passwort im Klartext über SMTP an den E-Mail-Server des Abonnenten. E-Mail reist im Klartext über mehrere SMTP-Hops.
Das Mailman-Team entwarf beide Verhaltensweisen. Wiederherstellung war die Funktion: Abonnenten konnten vergessene Passwörter abrufen. Der Begriff Glas-Safe stammt von diesem: Das Safe hält Anmeldeinformationen in sichtbarer Form. Jeder, der das Safe erreicht, kann alle Inhalte gleichzeitig lesen.
Der bereits gestohlene Grundsatz
Ein Passwort, das in einer wiederherstellbaren Form gespeichert ist, ist bereits gestohlen. Der Angreifer ist noch nicht eingetroffen. Der Einsturz ist noch nicht passiert. Aber die Architektur garantiert: wenn ein Einsturz erfolgt, fallen alle Anmeldeinformationen gleichzeitig. Es tritt kein Einsturz isoliert auf; jede Anmeldeinformation in wiederherstellbarer Speicherung wird dem Angreifer in derselben Operation übertragen.
MOAD-0006 vs MOAD-0004
MOAD-0004 (Geloggtes Geheimnis): Passwörter wurden unabsichtlich in Logs geschrieben. Die Log-Schreibe war nicht die Absicht; es war ein Nebeneffekt der Header-Loggen für Debugging.
MOAD-0006 (Glas Safe): Passwörter wurden in wiederherstellbarer Form durch Entwurf gespeichert. Wiederherstellung war die Absicht. Die Passwort-Erinnerungs-Funktion erforderte das Speichern des Passworts. Die Anzeige des Passworts erforderte das Speichern. Der verbindliche Entwurf zur Wiederherstellung schuf den Fehler.
Einfache Unterscheidung: MOAD-0004 legt durch versehentliche Eintragung Kennungen in Protokolldateien fest; MOAD-0006 speichert Kennungen absichtlich in wiederherstellbarer Form. Die Behebungsmaßnahmen wirken sich auf verschiedenen Ebenen aus.
Strukturell vs. Zufällig
Die architektonische Unterscheidung zwischen MOAD-0006 & MOAD-0004 bestimmt die Behebungsstrategie. Zufällige Protokollierung: Behebung auf der Serialisierungsebene. Geplant für Wiederherstellungsspeicherung: Neukonzeptionierung des Features, das Wiederherstellung benötigt.
Warum funktioniert bcrypt
Ein einweg-Hash-Funktion akzeptiert ein Passwort und erzeugt eine festgelegte Länge des Digests. Gegeben der Digest, kann die ursprüngliche Passwort nicht wiederhergestellt werden. Nicht 'schwierig zu wiederherstellen': unmöglich rückgängig zu machen. Die Funktion läuft in eine Richtung.
Drei erforderliche Eigenschaften für die Speicherung von Kennungen:
1. Einweg (Präbildwiderstand). Gegeben hash(password), kann keine Algorithmus password schneller wiederherstellen als durch Brute-Force. Bcrypt, scrypt und argon2 erfüllen alle diese Eigenschaft.
2. Salz. Ein zufälliges Wert, der vor dem Hashen dem Passwort hinzugefügt wird. Das gleiche Passwort, verschiedene Salze, verschiedene Hashes. Zweck: besiegt Regenbogen-Tabellen (vorkomputierte Hash-Verzeichnisse). Ohne Salz: Ein Angreifer berechnet hash('password123') einmal und prüft es gleichzeitig für 1 Million Benutzer. Mit Salz: Jeder Benutzer hat einen eindeutigen Hash, selbst für das gleiche Passwort.
3. Langsam geplant. bcrypt akzeptiert einen Work Factor. Höherer Work Factor: mehr Iterationen, mehr Rechenzeit pro Hash-Versuch. Login: 300ms zum Hashen einmal. Akzeptabel. Brute-Force: 300ms pro Versuch. Bei 1 Milliarde Versuche: 9,5 Jahre pro Passwort. Unakzeptabel für einen Angreifer. Die Geschwindigkeit: eine Funktion, kein Defekt.
import bcrypt
# Speichern: einweg-Hash mit Salz
def store_password(plaintext: str) -> bytes:
return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))
# Verifizieren: Hashen des Kandidaten & Vergleichen der Digeste
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
return bcrypt.checkpw(plaintext.encode(), stored_hash)
# NIE gespeichert: das klare Text-Passwort
# NIE wiederhergestellt: das klare Text-Passwort aus dem Hash
# Passwort zurücksetzen, nicht Passwort vergessen
Der Handel
Einweg-Hashing macht das Zurückholen von Passwörtern unmöglich. Ein Benutzer, der sein Passwort vergessen hat, kann es nicht wiederbekommen. Ein Passwort-Erinnerungse-Mail kann nicht existieren. Die Benutzererfahrung ändert sich: 'Passwort vergessen? Es resetzen.' Keine Verschlechterung: eine Sicherheitsgrenze. Das System, das ein Passwort nicht wiederherstellen kann, kann kein Passwort preisgeben.
Eine Datenbankverletzung, die bcrypt-Hashes offenlegt: Alle Hashs sind sichtbar, keine Passwörter sichtbar. Ein Angreifer muss jeden Hash einzeln durch brute-forcing versuchen, bei 300ms pro Versuch, mit einem pro-Nutzer-Salz, das vorberechnete Tabellen ausschaltet. Eine Verletzung, die plaine Text-Passwörter offenlegt: Gesamte sofortige Offenlegung.
Starke Verschlüsselung reicht nicht aus
Eine Sicherheitsprüfung identifiziert ein System zur Speicherung von Anmeldeinformationen. Passwörter werden mit AES-256-CBC-Verschlüsselung mit einem serversseitigen Schlüssel gespeichert. Der Prüfbericht kennzeichnet es als Glass Safe Defekt.
Die Entwicklerteam reagiert: 'AES-256 ist der stärkste symmetrische Chiffrieralgorithmus verfügbar. Der Schlüssel befindet sich in einem Hardware-Sicherheitsmodul. Kein Angreifer kann diese Passwörter entschlüsseln.'