Version: 1.0
Datum: 15. Dezember 2025
Status: Gültig
Genehmigt durch: ThemisDB Security Team
Nächste Überprüfung: 15. Juni 2026
Diese Kryptographie-Policy definiert die Standards und Anforderungen für den Einsatz kryptographischer Verfahren in ThemisDB. Sie stellt sicher, dass alle kryptographischen Operationen den aktuellen Best Practices und Compliance-Anforderungen (BSI C5, ISO 27001, DSGVO) entsprechen.
Diese Policy gilt für:
- Alle kryptographischen Operationen in ThemisDB
- Verschlüsselung von Daten at-rest und in-transit
- Schlüsselmanagement und -verwaltung
- Entwicklung, Betrieb und Wartung
- BSI C5 (2020): Cloud Computing Compliance Criteria Catalogue, Kontrollen CRY-01 bis CRY-06
- BSI TR-02102-1: Kryptographische Verfahren: Empfehlungen und Schlüssellängen (2024-01)
- ISO/IEC 27001:2013: Informationssicherheit, Anhang A.10 (Kryptographie)
- NIST SP 800-38D: Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM)
- NIST SP 800-57: Recommendation for Key Management
Primär:
Algorithmus: AES-256-GCM (Advanced Encryption Standard)
Modus: Galois/Counter Mode (AEAD - Authenticated Encryption with Associated Data)
Schlüssellänge: 256 bit (32 bytes)
IV-Länge: 96 bit (12 bytes) - zufällig generiert pro Operation
Tag-Länge: 128 bit (16 bytes) - für AuthentifizierungBegründung:
- AES-256 ist BSI-empfohlen für "VS-NfD" (Verschlusssache - Nur für den Dienstgebrauch)
- GCM bietet sowohl Vertraulichkeit als auch Integrität (AEAD)
- Keine bekannten praktischen Angriffe auf AES-256-GCM
Alternative (falls erforderlich):
Algorithmus: ChaCha20-Poly1305
Schlüssellänge: 256 bit
Nonce-Länge: 96 bit
Tag-Länge: 128 bitNICHT zugelassen:
- ❌ AES-ECB (keine Authentifizierung, Pattern Leakage)
- ❌ DES, 3DES (veraltet, zu kurze Schlüssel)
- ❌ RC4 (Bias in Keystream)
- ❌ AES-CBC ohne HMAC (keine Authentifizierung)
RSA:
Schlüssellänge: Minimum 2048 bit, empfohlen 4096 bit
Padding: OAEP (Optimal Asymmetric Encryption Padding) mit SHA-256
Verwendung: Schlüsselaustausch, ZertifikateElliptic Curve (ECDH, ECDSA):
Kurven: P-256 (NIST), P-384, Curve25519
Verwendung: TLS, SchlüsselaustauschNICHT zugelassen:
- ❌ RSA < 2048 bit
- ❌ RSA ohne Padding
- ❌ Schwache Kurven (< 256 bit)
Hash-Funktionen:
Primär: SHA-256, SHA-384, SHA-512
Verwendung: Integritätsprüfung, Signaturen, HMACMessage Authentication Codes (MAC):
Algorithmus: HMAC-SHA256
Verwendung: NachrichtenauthentifizierungKey Derivation:
Algorithmus: HKDF-SHA256 (HMAC-based Key Derivation Function)
Verwendung: Content-based metadata, SchlüsselableitungNICHT zugelassen:
- ❌ MD5 (Kollisionen gefunden)
- ❌ SHA-1 (schwach, Sunset 2020)
RSA: RSA-SHA256, Minimum 2048 bit
ECDSA: P-256 oder P-384
EdDSA: Ed25519 (für moderne Anwendungen)Protokoll: TLS 1.3 (primär), TLS 1.2 (fallback)
Cipher Suites:
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
- ECDHE-RSA-AES256-GCM-SHA384
- ECDHE-RSA-AES128-GCM-SHA256
NICHT zugelassen:
- SSLv2, SSLv3 (unsicher)
- TLS 1.0, TLS 1.1 (veraltet)
- Cipher Suites mit RC4, DES, MD5
- NULL-Cipher
- Export-Grade CipherThemisDB verwendet eine zweistufige Schlüsselhierarchie:
┌────────────────────────────────────────┐
│ Key Encryption Key (KEK) │
│ - Gespeichert: Vault/KMS/HSM │
│ - Rotation: Jährlich │
│ - Länge: 256 bit │
└──────────────┬─────────────────────────┘
│ verschlüsselt
▼
┌────────────────────────────────────────┐
│ Data Encryption Keys (DEK) │
│ - Gespeichert: Verschlüsselt im Cache │
│ - Rotation: Vierteljährlich │
│ - Länge: 256 bit │
│ - TTL: 1 Stunde (Cache) │
└────────────────────────────────────────┘
Anforderungen:
- Verwendung kryptographisch sicherer Zufallszahlengeneratoren (CSPRNG)
- OpenSSL
RAND_bytes()oder/dev/urandom(Linux) - Mindest-Entropie: 256 bit für symmetrische Schlüssel
Verfahren:
// Korrekt:
std::vector<uint8_t> key(32); // 256 bit
if (RAND_bytes(key.data(), key.size()) != 1) {
throw KeyGenerationException("Insufficient entropy");
}
// NICHT zulässig:
std::srand(time(NULL)); // ❌ std::rand() ist NICHT kryptographisch sicherKEK (Key Encryption Keys):
- MUSS in externem Key Management System gespeichert werden:
- HashiCorp Vault (empfohlen)
- AWS KMS, Azure Key Vault, GCP KMS
- Hardware Security Module (HSM) mit PKCS#11
- DARF NICHT im Klartext auf Festplatte gespeichert werden
- Zugriff nur über authentifizierte Service-Principals
DEK (Data Encryption Keys):
- Verschlüsselt mit KEK
- Cache: Max. 1000 Keys, 1 Stunde TTL
- LRU-Eviction bei Cache-Überlauf
- Im Memory nur für aktive Operationen
Verboten:
- ❌ Hardcoded Keys im Quellcode
- ❌ Keys in Konfigurationsdateien (ohne Verschlüsselung)
- ❌ Keys in Versionskontrolle (Git)
- ❌ Keys in Logdateien
Rotationsfrequenzen:
| Schlüsseltyp | Reguläre Rotation | Notfall-Rotation |
|---|---|---|
| KEK (Master) | Jährlich | < 24 Stunden |
| DEK (Data) | Vierteljährlich | < 7 Tage |
| TLS-Zertifikate | Jährlich (90 Tage empfohlen) | < 24 Stunden |
Rotationsprozess (Vier-Phasen-Modell):
-
Phase 1: Dual-Write (Woche 1-2)
- Neuer Schlüssel wird erstellt
- Neue Daten mit neuem Schlüssel verschlüsselt
- Alte Daten mit altem Schlüssel entschlüsselbar
-
Phase 2: Re-Encryption (Woche 3-4)
- Hintergrundjob verschlüsselt alte Daten neu
- Progress Tracking und Monitoring
- Idempotente Operation (Wiederholbar)
-
Phase 3: Deprecation (Woche 5)
- Alter Schlüssel wird als DEPRECATED markiert
- Monitoring für unerwartete Zugriffe
- 30 Tage Übergangszeit
-
Phase 4: Deletion (Woche 8+)
- Alter Schlüssel wird gelöscht
- Audit-Log-Eintrag
- Bestätigung durch Security Team
Notfall-Rotation (bei Kompromittierung):
- Sofortige Deaktivierung des kompromittierten Schlüssels
- Erstellung eines neuen Schlüssels innerhalb 1 Stunde
- Re-Encryption mit hoher Priorität (24-48 Stunden)
- Incident Report und Root-Cause-Analysis
Verfahren:
- Sicheres Überschreiben (mindestens 1x mit Zufallsdaten)
- Verwendung von
memset_s()oderexplicit_bzero() - Loggen der Vernichtung im Audit-Log
- Aufbewahrung von Metadaten (wann, wer, warum) für 7 Jahre
// Korrekt:
void secureZero(std::vector<uint8_t>& key) {
#ifdef _WIN32
SecureZeroMemory(key.data(), key.size());
#else
explicit_bzero(key.data(), key.size());
#endif
}
// NICHT ausreichend:
key.clear(); // ❌ Compiler könnte optimierenAnforderungen:
- MUSS für jede Verschlüsselung einzigartig sein
- MUSS kryptographisch zufällig generiert werden (CSPRNG)
- DARF NICHT wiederverwendet werden (für denselben Schlüssel)
- Länge: 96 bit (12 bytes) für AES-GCM
Implementierung:
// Korrekt:
std::vector<uint8_t> iv(12);
RAND_bytes(iv.data(), iv.size());
// NICHT zulässig:
std::vector<uint8_t> iv(12, 0); // ❌ Null-IV
iv = last_iv; // ❌ IV-Wiederverwendung
iv = counter++; // ❌ VorhersagbarAnforderungen:
- MUSS bei AEAD-Modi (GCM, CCM, ChaCha20-Poly1305) verwendet werden
- Tag-Länge: Minimum 96 bit, empfohlen 128 bit
- MUSS vor Entschlüsselung verifiziert werden
- Bei Verifikationsfehler: Sofort abbrechen, keine Information preisgeben
Implementierung:
// Entschlüsselung mit Tag-Verifikation
int ret = EVP_DecryptFinal_ex(ctx, plaintext + len, &len);
if (ret <= 0) {
// Tag-Verifikation fehlgeschlagen
throw DecryptionException("Authentication failed");
// ❌ NICHT: Details über den Fehler preisgeben
}Bei Modi die Padding erfordern (CBC):
- MUSS PKCS#7 Padding verwendet werden
- Padding Oracle-Angriffe vermeiden: Konstante Zeit für Fehler
- Besser: Verwende AEAD-Modi (kein Padding erforderlich)
Anforderungen:
- Kryptographische Fehler MÜSSEN geloggt werden (ohne sensitive Daten)
- Keine Details über Fehler an Angreifer zurückgeben
- Konstante Zeit für Fehlerbehandlung (Timing-Angriffe vermeiden)
// Gut:
try {
decrypt(ciphertext);
} catch (const DecryptionException& e) {
AuditLogger::log("Decryption failed", {
{"key_id", key_id},
{"error_type", "auth_failed"}
// ❌ NICHT loggen: plaintext, key, iv
});
throw; // Generic error nach außen
}Zu loggende Ereignisse:
Schlüsseloperationen:
- Schlüsselerzeugung (key_id, algorithm, creator)
- Schlüsselabruf (key_id, version, timestamp)
- Schlüsselrotation (key_id, old_version, new_version)
- Schlüsseldeaktivierung (key_id, reason)
- Schlüsselvernichtung (key_id, timestamp, operator)
Verschlüsselungsoperationen:
- Verschlüsselung (key_id, key_version, success)
- Entschlüsselung (key_id, key_version, success/failure)
- Authentifizierungsfehler (key_id, timestamp)
Administrative Operationen:
- Policy-Änderungen (what, who, when)
- Konfigurationsänderungen (parameter, old_value, new_value)
- Notfall-Rotationen (reason, initiated_by)NICHT loggen:
- ❌ Plaintext-Daten
- ❌ Kryptographische Schlüssel
- ❌ IVs oder Nonces (außer als Hash)
- ❌ Vollständige Ciphertexte
Metriken:
Performance:
- encryption_operations_total{operation, key_id}
- encryption_duration_seconds{operation, quantile}
- key_cache_hit_rate{key_id}
Sicherheit:
- key_rotation_age_days{key_id}
- deprecated_key_access_total{key_id}
- encryption_errors_total{error_type}
- authentication_failures_total{key_id}Alerts:
Critical:
- Deprecated key access > 0
- Authentication failure rate > 1%
- Key rotation overdue > 30 days
Warning:
- Cache hit rate < 90%
- Encryption error rate > 0.1%
- Key age > 80% of rotation intervalErforderliche Dokumentation:
- ✅ Kryptographie-Policy (dieses Dokument)
- ✅ Schlüsselmanagement-Verfahren
- ✅ Rotations-Runbooks
- ✅ Incident-Response-Playbook
- ✅ Audit-Logs (7 Jahre Aufbewahrung)
Regelmäßige Überprüfungen:
- Jährliche Policy-Review
- Vierteljährliche Compliance-Audits
- Monatliche Schlüsselrotations-Checks
Verantwortlichkeiten:
- Genehmigung von Policy-Änderungen
- Überwachung der Compliance
- Incident-Response bei Kompromittierung
- Jährliche Policy-Review
Verantwortlichkeiten:
- Implementierung gemäß Policy
- Code-Reviews für kryptographische Operationen
- Unit-Tests für Verschlüsselung
- Dokumentation von Änderungen
Verantwortlichkeiten:
- Schlüsselrotation durchführen
- KMS/Vault-Administration
- Monitoring und Alerting
- Backup und Recovery
Verantwortlichkeiten:
- Audit-Überprüfungen
- Compliance-Berichte
- Externe Audits koordinieren
Ausnahmen von dieser Policy sind nur in begründeten Fällen zulässig und erfordern:
- Schriftliche Begründung mit technischer Rechtfertigung
- Risk Assessment durch Security Team
- Formale Genehmigung durch Security Officer
- Befristete Gültigkeit (max. 12 Monate)
- Kompensatorische Kontrollen definieren
- Audit-Trail der Entscheidung
Für bestehende Implementierungen vor dieser Policy:
- Migration Plan innerhalb 12 Monate
- Temporäre Ausnahme mit Risikobewertung
- Monitoring der Legacy-Verwendung
- Deprecation Timeline festlegen
Versionierung:
- Semantic Versioning (MAJOR.MINOR.PATCH)
- MAJOR: Grundlegende Änderungen (neue Algorithmen)
- MINOR: Ergänzungen (neue Abschnitte)
- PATCH: Korrekturen, Klarstellungen
Änderungsprozess:
- Vorschlag durch Security Team oder Stakeholder
- Impact Analysis
- Review durch Development, Ops, Compliance
- Genehmigung durch Security Officer
- Kommunikation an alle Teams
- Implementation Grace Period (30 Tage)
- Regulär: Jährlich (15. Dezember)
- Ad-hoc: Bei Sicherheitsvorfällen oder neuen Bedrohungen
- Trigger: Neue BSI/NIST-Empfehlungen
- Alle Entwickler MÜSSEN diese Policy vor Implementierung kryptographischer Funktionen lesen
- Jährliche Security-Awareness-Schulung
- Spezielle Schulung bei Policy-Updates
Siehe:
docs/security/security_column_encryption.md(Design)include/security/encryption.h(API)src/security/field_encryption.cpp(Implementierung)tests/test_encryption.cpp(Tests)
| BSI C5 | ISO 27001 | NIST | Diese Policy |
|---|---|---|---|
| CRY-01 | A.10.1.1 | SC-12 | Abschnitt 2 |
| CRY-02 | A.10.1.2 | SC-12, SC-13 | Abschnitt 3 |
| CRY-03 | A.10.1.1 | SC-28 | Abschnitt 2 |
| CRY-04 | A.13.1.1 | SC-8 | Abschnitt 2.2 |
| CRY-05 | A.10.1.2 | SC-12 | Abschnitt 3.4 |
| CRY-06 | A.10.1.1 | SC-13 | Abschnitt 4.2 |
Häufige Fehler (NICHT tun):
// ❌ Schwache Schlüssel
std::vector<uint8_t> key = {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'};
// ❌ IV-Wiederverwendung
static std::vector<uint8_t> iv(12, 0); // Konstante IV
// ❌ Keine Authentifizierung
// CBC-Modus ohne HMAC
// ❌ Hardcoded Keys
const char* KEY = "super_secret_key_1234567890";
// ❌ Unsichere Zufallszahlen
std::srand(time(NULL));
int iv = std::rand();
// ❌ Fehler ignorieren
EVP_EncryptFinal_ex(ctx, out, &len); // return value ignoriertErstellt von: ThemisDB Security Team
Erstellt am: 15. Dezember 2025
Genehmigt von:
- Chief Security Officer (CSO)
- Chief Technology Officer (CTO)
- Compliance Officer
Inkrafttreten: 15. Dezember 2025
Nächste Überprüfung: 15. Juni 2026 (6 Monate)
Änderungshistorie:
| Version | Datum | Autor | Änderungen |
|---|---|---|---|
| 1.0 | 2025-12-15 | Security Team | Initiale Version |
Dokumentstatus: ✅ Aktiv
Vertraulichkeit: Intern
Klassifizierung: Organisatorisch