Hex-Viewer

🔬Aufbau einer KDBX-Datei – Byte für Byte

Jede farbige Fläche ist ein Feld aus der Spezifikation. Der äußere Header ist ohne Passwort lesbar; mit Passwort kommen die entschlüsselten und entpackten Bytes (innerer Header + XML) als weitere Ansichten dazu.
Demo-Datenbank|
Schlüsseldatei (optional)

🧅Die Schichten im Überblick

KDBX 4.x (Datei)                                         Offset
┌──────────────────────────────────────────────────────┐
│ 03 D9 A2 9A   Signatur 1  0x9AA2D903                 │  0
│ 67 FB 4B B5   Signatur 2  0xB54BFB67                 │  4
│ 01 00 04 00   Version 4.1 (Minor, Major)             │  8
├──────────────────────────────────────────────────────┤
│ [ID][Int32 Länge][Daten]  CipherID · Compression ·   │ 12
│  MasterSeed · EncryptionIV · KdfParameters (VD) ·    │
│  PublicCustomData · EndOfHeader (ID 0)               │
├──────────────────────────────────────────────────────┤
│ SHA-256(Header)            32 Byte                   │
│ HMAC-SHA-256(Header)       32 Byte   <- Passwort-Test│
├──────────────────────────────────────────────────────┤
│ Block 0: [HMAC 32][Int32 n][n Byte Chiffretext]      │
│ Block 1: …                                           │
│ Endblock: [HMAC 32][00 00 00 00]                     │
└──────────────────────────────────────────────────────┘
      │ entschlüsseln (AES-256-CBC / ChaCha20)
      ▼ entpacken (gzip)
┌──────────────────────────────────────────────────────┐
│ innerer Header: StreamID 3 · StreamKey 64 B · Binary │
│ XML: <KeePassFile><Meta/><Root><Group><Entry>…       │
└──────────────────────────────────────────────────────┘
KDBX 3.1 (Datei)
┌──────────────────────────────────────────────────────┐
│ Signaturen · Version 3.1 (01 00 03 00)               │
│ [ID][UInt16 Länge][Daten]  … zusätzlich:             │
│  TransformSeed · TransformRounds · ProtectedStreamKey│
│  StreamStartBytes · InnerRandomStreamID              │
├──────────────────────────────────────────────────────┤
│ AES-256-CBC-Chiffretext (ohne äußere Blöcke)         │
└──────────────────────────────────────────────────────┘
      │ entschlüsseln
      ▼
┌──────────────────────────────────────────────────────┐
│ StreamStartBytes (32 B)          <- Passwort-Test    │
│ Hash-Block: [UInt32 i][SHA-256][Int32 n][Daten] …    │
└──────────────────────────────────────────────────────┘
      ▼ gzip → XML (Anhänge Base64 in Meta/Binaries)
Little Endian überall
Zahlen stehen mit dem niederwertigsten Byte zuerst. Die Länge 32 steht als 20 00 00 00 da, die Version 4.1 als 01 00 04 00.
TLV = Typ · Länge · Wert
Unbekannte Feld-IDs kann ein Leser überspringen, weil die Länge vorne steht. So bleibt das Format erweiterbar.
Jedes Speichern ändert alles
MasterSeed, EncryptionIV, KDF-Salt und Innenstrom-Schlüssel werden bei jedem Speichern neu gewürfelt. Zwei Speicherstände derselben Datenbank sind Byte für Byte verschieden.