Verschluesselung¶
Uebersicht¶
Alle Daten in der FEGH-Dokumentation App werden mit AES-256-GCM verschluesselt gespeichert. Die Verschluesselung folgt dem Envelope Encryption-Muster mit Master Encryption Key (MEK) und Data Encryption Keys (DEK).
Verschluesselungsschema¶
Hierarchie¶
MEK (Master Encryption Key)
└── DEK 1 (Data Encryption Key) → Datensatz 1
└── DEK 2 → Datensatz 2
└── DEK n → Datensatz n
Ablauf beim Verschluesseln¶
- Fuer jeden Datensatz wird ein zufaelliger 32-Byte DEK generiert
- Der Datensatz wird mit dem DEK verschluesselt (AES-256-GCM, 12-Byte Nonce)
- Der DEK wird mit dem MEK verschluesselt (AES-256-GCM, eigener Nonce)
- Beides wird zusammen als
EncryptedRecordgespeichert
Verschluesseltes Datensatz-Format¶
{
"v": 1,
"alg": "AES-256-GCM",
"nonce": "<Base64>",
"aad": {},
"ciphertext": "<Base64>",
"tag": "<Base64>",
"dekWrapped": {
"alg": "AES-256-GCM",
"nonce": "<Base64>",
"ciphertext": "<Base64>",
"tag": "<Base64>"
}
}
Master Encryption Key (MEK)¶
Der MEK wird auf verschiedene Arten bereitgestellt:
1. OS-Keychain (Primaer)¶
- iOS: Keychain mit
first_unlock_this_deviceAccessibility - Android: Encrypted SharedPreferences
- macOS/Windows/Linux: Flutter Secure Storage
2. PBKDF2-Fallback¶
Wenn der Keychain nicht verfuegbar ist:
- 100.000 Iterationen HMAC-SHA256
- Salt: Zufaellig generiert, lokal gespeichert
- Passwort: Hardware-Identifier + Plattform-Info (oder externe Sync-Passphrase)
3. Externer MEK (Team-Key)¶
Fuer Team-Arbeit kann ein externer MEK gesetzt werden:
- 32-Byte Team-Key aus dem Provisioning-Token
- Ueberschreibt den lokalen MEK fuer Team-Daten
- Ermoeglicht gemeinsamen Zugriff auf verschluesselte Daten
Manifest¶
Ein verschluesseltes Manifest (manifest.json) indexiert alle gespeicherten Datensaetze:
- UUID-basierte Dateinamen (keine personenbezogenen Daten in Pfaden)
- Schema, Titel und Metadaten pro Eintrag
- Wird mit dem MEK verschluesselt
Dateinamen¶
Alle Dateien auf HiDrive werden mit UUIDs benannt (z.B. a1b2c3d4-e5f6-...bin). Es sind keine personenbezogenen Daten in Dateinamen oder Ordnerstrukturen sichtbar.
Sichere Loeschung (Crypto-Erasure)¶
Bei der Datenlöschung (cryptoErasure()) werden:
- Alle Dateien einzeln mit Zufallsdaten ueberschrieben (verhindert forensische Wiederherstellung)
- Danach geloescht
- Der MEK wird aus dem Keychain entfernt
- Der Cache wird geleert
Selbst wenn eine Datei physisch wiederhergestellt werden koennte, ist sie ohne MEK nicht entschluesselbar.
Passwort-Hashing¶
App-Passwoerter werden mit PBKDF2 gehasht:
- 100.000 Iterationen HMAC-SHA256
- Zufaelliger Salt pro Passwort
- Salt und Hash zusammen gespeichert (
salt:hash) - Abwaertskompatible Migration von altem SHA256-Format
Audit-Logging¶
Alle sicherheitsrelevanten Aktionen werden persistent protokolliert:
- Login/Logout (erfolgreich und fehlgeschlagen)
- Klient erstellt/geaendert/geloescht
- Team erstellt, User eingeladen, Rolle geaendert
- Datenexport, Datenloeschung
- Recovery-Token generiert/eingeloest
Format: JSON-Lines in audit.log, eine Zeile pro Eintrag mit Zeitstempel, Aktion und User-ID.