Was eine Speicherformat wiederherstellbar macht
Vier Speicherformate, nach Wiederherstellbarkeit geordnet:
| Format | Wiederherstellbar? | Beispiel | Wiederherstellungsmethode |
|---|---|---|---|
| Klartext | Ja | password: hunter2 | Datei lesen |
| Base64 | Ja | cGFzc3dvcmQ= | base64 --decode |
| Reversibler Cipher (AES) | Ja | ENC[AES256:...] | Mit Schlüssel entschlüsseln |
| Einweg-Hash (bcrypt) | Nein | $2b$12$... | Kann nicht umgekehrt werden; Brute-Force erforderlich |
Klartext, Base64 und reversibler Cipher: alles wiederherstellbar. Ein einzelner Dump der Anmeldedaten-Datenbank gibt einem Angreifer alle Passwörter im Klartext für alle Benutzer gleichzeitig. Ein Vorfall; totale Offenlegung.
Das Mailman 2.x-Beispiel
Mailman 2.x (GNU-Mailinglisten-Manager): speicherte Abonnenten-Passwörter im Klartext. Monatliche Passworterinnerungs-E-Mail: sendete allen Abonnenten ihr Passwort im Klartext. Zwei separate Mängel, beide MOAD-0006:
1. Speicherung: Klartext in der Listen-Datenbank. Ein Server-Kompromittierung legt alle Abonnenten-Passwörter offen.
2. Broadcast: Die monatliche E-Mail sendet das Klartext-Passwort über SMTP an den E-Mail-Server des Abonnenten. E-Mails werden im Klartext über mehrere SMTP-Hops übertragen.
Das Mailman-Team hat beide Verhaltensweisen entworfen. Die Wiederherstellung war das Feature: Abonnenten konnten vergessene Passwörter abrufen. Der Name Glass Safe kommt daher: der Safe hält Anmeldedaten in sichtbarer Form. Jeder, der den Safe erreicht, kann alle Inhalte gleichzeitig lesen.
Das Already-Stolen-Prinzip
Eine Anmeldedaten, die in wiederherstellbarer Form gespeichert sind, sind bereits gestohlene Anmeldedaten. Der Angreifer ist noch nicht eingetroffen. Die Sicherheitsverletzung hat noch nicht stattgefunden. Aber die Architektur garantiert: Wenn eine Sicherheitsverletzung auftritt, fallen alle Anmeldedaten gleichzeitig. Keine Sicherheitsverletzung erfolgt isoliert; jede Anmeldedaten in wiederherstellbarer Speicherung wird in derselben Operation an den Angreifer übertragen.
MOAD-0006 vs MOAD-0004
MOAD-0004 (Logged Secret): Anmeldedaten, die versehentlich in Protokolle geschrieben wurden. Das Schreiben in das Protokoll war nicht beabsichtigt; es war eine Nebenwirkung der Aktivierung der Header-Protokollierung für das Debugging.
MOAD-0006 (Glass Safe): Anmeldedaten, die absichtlich in wiederherstellbarer Form gespeichert wurden. Die Wiederherstellung war die Absicht. Das Passwort-Erinnerungs-Feature erforderte die Speicherung des Passworts. Das Anzeige-Passwort-Feature erforderte die Speicherung. Das architektonische Bekenntnis zur Wiederherstellung hat den Defekt verursacht.
Einzeilige Unterscheidung: MOAD-0004 legt Anmeldedaten versehentlich in Protokollen ab; MOAD-0006 speichert Anmeldedaten absichtlich in wiederherstellbarer Form. Die Korrekturen erfolgen auf unterschiedlichen Ebenen.
Strukturell vs. Zufällig
Die architektonische Unterscheidung zwischen MOAD-0006 und MOAD-0004 bestimmt die Fix-Strategie. Ein versehentlicher Log-Schreibvorgang: die Serialisierungsschicht korrigieren. Ein für die Wiederherstellung konzipierter Speicher: das Feature, das die Wiederherstellung erforderte, neu gestalten.
Warum bcrypt funktioniert
Eine Einweg-Hash-Funktion nimmt ein Passwort entgegen und erzeugt einen Digest fester Länge. Aus dem Digest kann das ursprüngliche Passwort nicht wiederhergestellt werden. Nicht „schwer wiederherzustellen“: unmöglich umzukehren. Die Funktion läuft nur in eine Richtung.
Drei Eigenschaften sind für die Speicherung von Zugangsdaten erforderlich:
1. Einweg-Funktion (Preimage-Resistenz). Bei gegebenem hash(password) darf kein Algorithmus das password schneller als durch Brute-Force wiederherstellen. bcrypt, scrypt und argon2 erfüllen alle diese Eigenschaft.
2. Salt. Ein zufälliger Wert, der dem Passwort vor dem Hashing vorangestellt wird. Gleiches Passwort, unterschiedlicher Salt, unterschiedlicher Hash. Zweck: Schutz vor Rainbow Tables (vorkalkulierte Hash-Wörterbücher). Ohne Salt: ein Angreifer berechnet hash('password123') einmal und prüft alle 1 Million Benutzer gleichzeitig. Mit Salt: jeder Benutzer hat einen eindeutigen Hash, selbst bei gleichem Passwort.
3. Absichtlich langsam. bcrypt akzeptiert einen Work-Faktor. Höherer Work-Faktor: mehr Iterationen, mehr Rechenzeit pro Hash-Versuch. Login: 300 ms für einen Hash. Akzeptabel. Brute-Force: 300 ms pro Versuch. Bei 1 Milliarde Versuchen: 9,5 Jahre pro Passwort. Für einen Angreifer unakzeptabel. Die Langsamkeit ist ein Feature, kein Defekt.
import bcrypt
# Speichern: Einweg-Hash mit Salt
def store_password(plaintext: str) -> bytes:
return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))
# Verifizieren: Kandidaten hashen & Digests vergleichen
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
return bcrypt.checkpw(plaintext.encode(), stored_hash)
# NIEMALS gespeichert: das Klartext-Passwort
# NIE wiederhergestellt: der Klartext aus dem Hash
# Passwort-Reset, kein Passwort-Erinnerung
Der Kompromiss
Einweg-Hashing macht die Passwort-Wiederherstellung unmöglich. Ein Benutzer, der sein Passwort vergisst, kann es nicht zurückerhalten. Eine Passwort-Erinnerungs-E-Mail kann nicht existieren. Die Benutzererfahrung ändert sich: „Passwort vergessen? Zurücksetzen.“ Keine Verschlechterung: eine Sicherheitsgrenze. Das System, das ein Passwort nicht wiederherstellen kann, kann kein Passwort preisgeben.
Ein Datenbank-Breach, der bcrypt-Hashes offenlegt: alle Hashes sichtbar, keine Passwörter sichtbar. Ein Angreifer muss jeden Hash einzeln brute-forcen, mit 300 ms pro Versuch, wobei der pro-Benutzer-Salt vorab berechnete Tabellen verhindert. Ein Breach, der Klartext-Passwörter offenlegt: totale sofortige Offenlegung.
Starke Verschlüsselung reicht nicht aus
Ein Sicherheitsaudit identifiziert ein Anmeldeinformations-Speichersystem. Passwörter werden mit AES-256-CBC-Verschlüsselung und einem serverseitigen Schlüssel gespeichert. Der Audit-Bericht kennzeichnet dies als Glass-Safe-Defekt.
Das Engineering-Team antwortet: „AES-256 ist der stärkste symmetrische Cipher, der verfügbar ist. Der Schlüssel befindet sich in einem Hardware-Security-Modul. Kein Angreifer kann diese Passwörter entschlüsseln.“