KeePass visuell erklärt

Was steckt in einer .kdbx-Datei – und wie wird sie geöffnet?

Eine KeePass-Datenbank ist eine Zwiebel aus Schichten: ein offener Header mit allen Parametern, ein HMAC-geschützter Blockstrom, AES-256 oder ChaCha20, gzip, ein innerer Header, das XML mit Gruppen und Einträgen – und darin die Passwörter noch einmal extra verschleiert. Diese App zeigt jede Schicht Byte für Byte und rechnet das Öffnen live in deinem Browser nach.

🧪 Synthetische Demo-Datenbanken
Vier erfundene Datenbanken (KDBX 4.1, 4.0 mit ChaCha20, 3.1 mit AES-KDF, 4.1 mit Schlüsseldatei), Passwort jeweils demo. Du kannst auch eine eigene Test-.kdbx lokal wählen – sie verlässt deinen Browser nie.
Datei · äußerer Header (offen lesbar)
03 D9 A2 9A 67 FB 4B B5 …
SHA-256 + HMAC-SHA-256 · HMAC-Blöcke
Integrität & Passwort-Test
AES-256-CBC / ChaCha20
Schlüssel = SHA-256(Seed ‖ Argon2(…))
gzip
1F 8B 08 …
innerer Header + XML
<KeePassFile> … <Entry>
Protected="True"
ChaCha20-Innenstrom
🔑
Sonne-Mond-Sterne-42!
03 D9 A2 9A
Signatur 1 (0x9AA2D903, LE)
67 FB 4B B5
Signatur 2 (0xB54BFB67, LE)
4 Byte
Feldlänge im Header ab KDBX 4 (vorher 2)
2⁶⁴ − 1
Blockindex für den Header-HMAC-Schlüssel
1 MiB
Standardgröße eines HMAC-Blocks
64 Byte
Innenstrom-Schlüssel (ChaCha20)

🗺️ Stationen

🔑 Vom Passwort zum Schlüssel (KDBX 4)

P   = SHA-256( UTF-8(Passwort) )
F   = Schlüssel aus Schlüsseldatei   (optional)
R   = SHA-256( P ‖ F )                  Composite Key
T   = Argon2d/id( R, Salt, m, t, p )     Transformed Key
Kₑ  = SHA-256( MasterSeed ‖ T )         → AES-256 / ChaCha20
K   = SHA-512( MasterSeed ‖ T ‖ 0x01 )  → HMAC-Basis
K_H = SHA-512( FF FF FF FF FF FF FF FF ‖ K )   Header
Kᵢ  = SHA-512( UInt64LE(i) ‖ K )               Block i

🧭 Was diese App zeigt

  • Den unverschlüsselten Header jeder .kdbx – auch ohne Passwort (Version, Chiffre, KDF-Parameter).
  • Wo KDBX 4 ein falsches Passwort erkennt: beim Header-HMAC, bevor irgendetwas entschlüsselt wird. KDBX 3.1 merkt es erst an den StreamStartBytes.
  • Warum Blöcke eigene HMAC-Schlüssel haben und warum ein Block am falschen Platz auffällt.
  • Wie Protected="True"-Werte mit einem fortlaufenden ChaCha20-Strom verschleiert werden – auch die in der Historie.
  • Was Argon2 gegen Brute-Force bringt – mit einer Messung in deinem Browser.