-
Notifications
You must be signed in to change notification settings - Fork 1
security_encryption_roadmap
Stand: 5. Dezember 2025
Version: 1.0.0
Kategorie: Security
Status: ✅ Implementierung abgeschlossen (8. November 2025 - Aktualisiert)
- ✅ KEK Persistence - Persistent IKM Storage in RocksDB
- ✅ Schema-based Encryption - Write & Read Path mit JWT-Context
- ✅ JWT Claims Extraction - user_id (sub) + groups aus Token
- ✅ Complex Type Support - vector, vector<uint8_t>, nested JSON
- ✅ Group-DEK Management - Multi-Party Encryption mit Rotation
- ✅ QueryEngine Integration - HTTP-Layer Decryption (Post-Processing)
- ✅ Graph-Encryption Design - Schema-driven via edges collection
- ✅ Key Rotation Strategy - Lazy Re-Encryption (Write-Back on Read)
- ✅ Performance Benchmarks - 6 Benchmarks in
bench_encryption.cpp - ✅ E2E Integration Tests - 10 Test-Szenarien in
test_encryption_e2e.cpp - ✅ Content Blob Encryption - Per-user HKDF-based blob encryption with "anonymous" fallback
- ✅ Vector Metadata Encryption - Schema-driven metadata encryption in batch_insert (excl. embeddings)
- ✅ Lazy Re-Encryption (Content) - Automatic key version upgrade on blob read
-
Konfiguration:
config:content_encryption_schema→{enabled: true, key_id: "content_blob"} -
Ablauf:
- Import via
/content/import→ Blob verschlüsselt mit HKDF(DEK, user_id, "content_blob") - Falls
user_idleer → Fallback auf "anonymous" Salt - Storage: JSON
{key_id, key_version, iv, ciphertext, tag}untercontent_blob:{id} - Retrieval via
/content/{id}/blob→ Entschlüsselung mit identischem HKDF
- Import via
-
Test:
test_http_content.cpp::BlobEncryption_StoresEncrypted_DecryptsOnRetrieval
-
Konfiguration:
config:encryption_schema→{collections: {name: {encryption: {enabled: true, fields: [...]}}}} -
Legacy-Support: Alte Schema-Form
{collections: {name: {fields: {field: {encrypt: true}}}}}ebenfalls unterstützt -
Ablauf:
- Batch-Insert prüft Schema für Collection (z.B. "test_docs")
- Metadatenfelder (außer
vector_field) werden verschlüsselt: HKDF(DEK, user_id, "field:{name}") - BaseEntity speichert:
{field: monostate, field_enc: true, field_encrypted: JSON} - Embedding bleibt unverschlüsselt für ANN-Index
-
Test:
test_http_vector.cpp::VectorBatchInsert_EncryptsMetadata_WhenSchemaEnabled- Nutzt
BaseEntity::deserializestatt JSON-Parsing (binäres Format) - Prüft monostate plaintext,
_encflag,_encryptedJSON mit iv/tag/ciphertext
- Nutzt
-
Trigger: Beim Lesen eines Content Blobs wird
blob.key_versionmitlatest_versionverglichen -
Ablauf:
- Entschlüssle mit alter Version
- Falls
blob.key_version < latest_version: Re-encrypt mit neuem Key - Speichere aktualisierte Version transparent
- Log: "Content blob {id} successfully re-encrypted to version {v}"
-
Test:
test_http_content.cpp::BlobLazyReencryption_UpgradesKeyVersionOnRead- Hinweis: Vollständige Validierung benötigt KeyProvider-Mock für echte Rotation
cd c:\VCC\themis
.\build.ps1Erwartete Ausgabe:
- Alle Targets erfolgreich kompiliert
- Keine Compiler-Warnings bei encryption-bezogenen Dateien
Betroffene Dateien:
-
src/server/auth_middleware.cpp(JWT Claims) -
src/server/http_server.cpp(Schema Encryption) -
benchmarks/bench_encryption.cpp(Performance Tests) -
tests/test_encryption_e2e.cpp(E2E Tests)
cd build
.\bench_encryption.exe --benchmark_filter="Schema|HKDF|Vector"Erwartete Metriken:
-
BM_HKDF_Derive_FieldKey: <50 µs (Baseline für alle Feldschlüssel) -
BM_SchemaEncrypt_SingleField/64: <200 µs (Email-Verschlüsselung) -
BM_SchemaEncrypt_SingleField/256: <500 µs (Adresse-Verschlüsselung) -
BM_SchemaEncrypt_MultiField_Entity: <2 ms (Realistische User-Entity: 4 Felder) -
BM_VectorFloat_Encryption: <5 ms (768-dim BERT-Embedding)
Performance-Ziele:
- ✅ <1 ms pro Feld (Average)
- ✅ <10% Throughput-Degradation vs. unencrypted
Performance-Optimierungen:
Status Update (08.11.2025):
- ✅ AES-NI Hardware-Acceleration: IMPLEMENTIERT
- CPU-Feature-Detection in
include/security/crypto_capabilities.h - Automatische Nutzung via OpenSSL EVP (kein manueller SIMD-Code nötig)
- Benchmark-Funktion verfügbar für Performance-Messungen
- Speedup: 4-8x auf unterstützten CPUs
- CPU-Feature-Detection in
Ausstehende Optimierungen:
-
HKDF-Caching für wiederholte Feldschlüssel-Ableitungen
- Aktuelle Implementierung: HKDF pro Feld (kein Cache)
- Vorgeschlagene Architektur: Thread-local LRU-Cache für (user_id, field_name) → derived_key
- Erwarteter Speedup: 3-5x bei wiederholten Operationen
- Geschätzter Aufwand: 4-6 Stunden
-
Batch-Encryption für Multi-Field Entities
- Single HKDF call + parallel field encryption
- Erwarteter Speedup: 20-30% für Entities mit >3 Feldern
- Geschätzter Aufwand: 6-8 Stunden
cd build
.\themis_tests.exe --gtest_filter="EncryptionE2E.*"10 Test-Szenarien:
-
UserIsolation- User A != User B (verschiedene HKDF-Keys) -
GroupSharing- HR-Team teilt Salary-Daten (Group-DEK) -
GroupDEKRotation- User-Exit → Zugriff verloren (v2 Key) -
SchemaEncryption_MultiField- 3-Feld-Entity (email/phone/ssn) -
ComplexType_VectorFloat- 768-dim Embedding -
ComplexType_NestedJSON- Verschachtelte Metadaten -
KeyRotation_VersionTracking- DEK v1/v2 parallel -
Performance_BulkEncryption- 1000 Entities (>1000 ops/sec) -
CrossField_Consistency- Verschiedene Felder → verschiedene Keys -
EdgeCase_EmptyString- Empty String Handling
Erwartete Ausgabe:
[==========] Running 10 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 10 tests from EncryptionE2ETest
[ RUN ] EncryptionE2ETest.UserIsolation_UserA_CannotDecrypt_UserB_Data
[ OK ] EncryptionE2ETest.UserIsolation_UserA_CannotDecrypt_UserB_Data (15 ms)
...
[==========] 10 tests from 1 test suite ran. (XXX ms total)
[ PASSED ] 10 tests.
Falls Tests fehlschlagen:
-
UserIsolation: HKDF-Ableitung prüfen (Salt = user_id?) -
GroupSharing: Group-DEK Storage korrekt? (group_dek:<name>:v1) -
GroupDEKRotation: Version-Tracking in EncryptedBlob.key_version korrekt? -
Performance_BulkEncryption: Target >1000 ops/sec (sonst Optimierung nötig)
Encryption-Schema für sensible Collections aktivieren:
{
"collections": {
"users": {
"encryption": {
"enabled": true,
"fields": ["email", "phone", "ssn", "address"],
"context_type": "user"
}
},
"employees": {
"encryption": {
"enabled": true,
"fields": ["salary", "bonus", "tax_id"],
"context_type": "group",
"group": "hr_team"
}
},
"documents": {
"encryption": {
"enabled": true,
"fields": ["content", "metadata", "embedding"],
"context_type": "user"
}
},
"edges": {
"encryption": {
"enabled": true,
"fields": ["weight", "metadata", "properties"],
"context_type": "user"
}
}
}
}Deployment:
curl -X PUT http://localhost:8080/config/encryption-schema \
-H "Authorization: Bearer $ADMIN_JWT" \
-H "Content-Type: application/json" \
-d @config/encryption_schema.jsonPrometheus Metrics (falls implementiert):
-
themis_encryption_ops_total{operation="encrypt|decrypt"}- Total Operations -
themis_encryption_duration_seconds{operation="encrypt|decrypt"}- Latenz-Histogram -
themis_encryption_errors_total{type="decrypt_failed|key_not_found"}- Error Counter -
themis_hkdf_derivations_total- HKDF Key-Derivations
Grafana Dashboard:
- Encryption Latency (p50, p95, p99)
- Throughput (ops/sec)
- Error Rate (Decrypt Failures)
- Key Rotation Events
DEK Rotation (alle 90 Tage):
# 1. Neue DEK-Version erstellen
curl -X POST http://localhost:8080/admin/rotate-dek \
-H "Authorization: Bearer $ADMIN_JWT"
# 2. Lazy Re-Encryption aktiviert → Alte Daten werden bei nächstem Schreibzugriff migriert
# Kein manueller Re-Encryption-Job nötigGroup-DEK Rotation (User-Exit):
# 1. User aus Gruppe entfernen (VCC-User-System)
curl -X DELETE http://localhost:9090/api/v1/groups/hr_team/members/user_bob
# 2. Group-DEK rotieren
curl -X POST http://localhost:8080/admin/rotate-group-dek \
-H "Authorization: Bearer $ADMIN_JWT" \
-d '{"group": "hr_team"}'
# 3. Neue Daten automatisch mit v2 verschlüsselt
# Alte Daten (v1) bleiben lesbar für noch autorisierte UserMonitoring:
-
EncryptedBlob.key_versionDistribution (wie viele v1 vs. v2 Blobs?) - Re-Encryption Progress (% migriert nach Rotation)
-
Searchable Encryption - Order-Preserving Encryption für Range-Queries
- Problem:
WHERE salary > 50000funktioniert nicht auf verschlüsselten Feldern - Lösung: OPE (Order-Preserving Encryption) für sortierbare Ciphertexts
- Trade-Off: Schwächere Sicherheit vs. Query-Support
- Problem:
-
QueryEngine Push-Down Decryption
- Problem: Filter/Sort auf verschlüsselten Feldern limitiert
- Lösung: JWT-Context in QueryEngine propagieren, Filter nach Decrypt anwenden
- Aufwand: Mittel (Context-Propagation durch alle Query-Layers)
-
Performance-Optimierung
- HKDF-Caching: Wiederholte Feldschlüssel-Ableitungen cachen (TTL: 5 min)
- Batch-Encryption: Multi-Field Entities parallel verschlüsseln (ThreadPool)
- SIMD: AES-NI Intrinsics für OpenSSL prüfen
-
Homomorphic Encryption - Rechnen auf verschlüsselten Daten
- Use-Case: Aggregationen (
SUM(salary)) ohne Decrypt - Technologie: Partial Homomorphic Encryption (Paillier)
- Aufwand: Hoch (neue Crypto-Bibliothek, Performance-Risiko)
- Use-Case: Aggregationen (
-
Secure Multi-Party Computation (SMPC) - Verteilte Schlüsselverwaltung
- Use-Case: KEK aufgeteilt auf 3 Nodes (2-of-3 Threshold)
- Technologie: Shamir's Secret Sharing + HSM Integration
- Aufwand: Sehr Hoch (Enterprise-Feature)
-
Field-Level Access Control - Granulare Berechtigungen
- Use-Case: User kann
emaillesen, aber nichtssn - Implementierung: ACL-Schema erweitern, QueryEngine Enforcement
- Aufwand: Mittel (Policy-Engine Integration)
- Use-Case: User kann
Aktuelle Docs:
-
docs/encryption_strategy.md- Architektur & Implementierung -
docs/key_rotation_strategy.md- Rotation Workflows -
docs/encryption_next_steps.md- Dieses Dokument
API-Dokumentation:
-
GET/PUT /config/encryption-schema- Schema-Management -
POST /admin/rotate-dek- DEK Rotation -
POST /admin/rotate-group-dek- Group-DEK Rotation -
GET/PUT /entities?decrypt=true- Transparent Decryption
Code-Kommentare:
-
include/security/field_encryption.h- FieldEncryption Klasse -
src/server/http_server.cpp::handlePutEntity- Write Path -
src/server/http_server.cpp::handleGetEntity- Read Path -
utils/hkdf_helper.h- HKDF Key-Derivation
Entwickler:
- Encryption Infrastructure: GitHub Copilot (November 2025)
- Code-Review: ThemisDB Core Team
Issues:
- Performance-Probleme: Benchmarks durchführen, Profiling mit
perf(Linux) oder VS Profiler (Windows) - Decrypt-Fehler: WARN-Logs prüfen (
THEMIS_WARN: Failed to decrypt field) - Key-Rotation-Issues:
EncryptedBlob.key_versionFeld prüfen
Weitere Hilfe:
- ThemisDB Slack:
#encryptionChannel - Wiki:
https://github.com/makr-code/ThemisDB/wiki/Encryption
- Architecture-ACCESS-MODEL-IMPLEMENTATION-SUMMARY
- Architecture-ADR-003-pg-dump-sql-parser
- Architecture-BASEENTITY-PRINCIPLE
- Architecture-CACHE-STORAGE-INTEGRATION
- Architecture-CMAKE-ARCHITECTURE
- Architecture-CMAKE-FLAGS-REFERENCE
- Architecture-CMAKE-MODULAR-ARCHITECTURE
- Architecture-CONCERNS-ARCHITECTURE-DIAGRAM
- Architecture-CONCERNS-IMPLEMENTATION-SUMMARY
- Architecture-CONTENT-MODEL
- Architecture-COPILOT-THEMISDB-GRAPH-RAG-BACKEND-ARCHITECTURE
- Architecture-CRYPTO-AND-KEYS
- Architecture-FEATURE-FLAGS-REFERENCE
- Architecture-GPU-ARCHITECTURE-REVIEW-TEMPLATE
- Architecture-HTTP-SHUTDOWN-HARDENING
- Architecture-MIGRATION-GUIDE-CONCERNS
- Architecture-MIGRATION-GUIDE-v13-v14
- Architecture-MODULARIZATION-GUIDE
- Architecture-MODULAR-ARCHITECTURE-ROADMAP
- Architecture-MODULE-ARCHITECTURE-INDEX
- Architecture-P1D01-ISSMPLUGIN-DESIGN-REVIEW
- Architecture-P1-D01-ISSMPLUGIN-DESIGN-REVIEW
- Architecture-P1-D08-MAMBA-GOVERNANCE-CONTRACT
- Architecture-P1-P2-IMPLEMENTATION-COMPLETION-INDEX
- Architecture-PHASE0-COMPLETION-ASSESSMENT
- Architecture-PHASE3-QUERYENGINE-DI-ARCHITECTURE
- Architecture-PHASE4-INDEX-MANAGER-DI
- Architecture-POSTGRESQL-WIRE-PROTOCOL
- Architecture-QUERYENGINE-IMPLEMENTATION-GUIDE
- Architecture-QUERY-SCHEDULING
- Architecture-RAFT-CONSENSUS-DESIGN
- Architecture-README
- Architecture-README-SSM-HYBRID-IMPLEMENTATION
- Architecture-REFACTORING-SUMMARY
- Architecture-RESOURCE-POOLING
- Architecture-SOURCE-DIRECTORY-GUIDE
- Architecture-THEMIS-CORE-GUIDE
- Architecture-UNIFIED-ACCESS-MODEL
- Architecture-WAL-GRPC-MTLS-CONFIGURATION
- Architecture-WIRE-PROTOCOL-RETRY
- Architecture-boltzmann-observability-draft
- Architecture-experimental-logarithmic-vector-storage
- Architecture-llm-wiki-mvp-adr
- Architecture-rewrite-engine-architecture
- Architecture-rope-api-architecture
- Architecture-ssm-gguf-mamba-status
- Architecture-ssm-hybrid-analysis
- Architecture-ssm-hybrid-rollout-plan
- Architecture-ssm-plugin-interface-design-review
- Architecture-transaction-coordinators
- Architecture-wiki-secondary-index
- Architecture-wire-protocol
- Governance-DISABLED-STUB-POLICY
- Governance-DOCS-PR-POLICY
- Governance-GA-PROMOTION-SIGN-OFF
- Governance-GITHUB-MILESTONES-SETUP
- Governance-MATURITY-CLAIM-VERIFICATION-CHECKLIST
- Governance-MATURITY-EVIDENCE-REGISTRY
- Governance-MERGE-GATE-BOT-CONFIG
- Governance-MERGE-GATE-STATUS-LIVE
- Governance-PHASE3-ENFORCEMENT-RUNBOOK
- Governance-PHASE-1-CLOSURE-REPORT
- Governance-PHASE-CLOSURE-POLICY
- Governance-PHASE-DEPENDENCY-GRAPH
- Governance-PLUGIN-SUBMODULE-ROLLBACK
- Governance-PRODUCTION-READY-2026-DELIVERY-PLAN
- Governance-PR-VERSION-TARGETING
- Governance-PR-VERSION-TARGETING-BACKFILL
- Governance-QUERY-MODULE-STATUS
- Governance-README
- Governance-RELEASE-PROMOTION-GATE-POLICY
- Governance-RELEASE-VALIDATION-CHECKLIST
- Governance-SECURITY-MODULE-5671-EVIDENCE-SUMMARY
- Governance-SHARDING-P6-RESIDUAL-RISK-ACCEPTANCE
- Governance-SOURCECODE-COMPLIANCE-GOVERNANCE
- Governance-UPDATES-DEVELOPMENT-STATUS-SIGN-OFF
- Governance-WAVE-C-IMPLEMENTATION-COMPLETE
- Module-acceleration-Roadmap
- Module-access-model-Roadmap
- Module-ai-Roadmap
- Module-analytics-Roadmap
- Module-api-Roadmap
- Module-aql-Roadmap
- Module-auth-Roadmap
- Module-base-Roadmap
- Module-cache-Roadmap
- Module-cdc-Roadmap
- Module-chaos-Roadmap
- Module-chimera-Roadmap
- Module-config-Roadmap
- Module-content-Roadmap
- Module-core-Roadmap
- Module-distributed-knowledge-Roadmap
- Module-distributed-tensor-Roadmap
- Module-document-Roadmap
- Module-ethics-ai-Roadmap
- Module-evaluation-Roadmap
- Module-execution-Roadmap
- Module-exporters-Roadmap
- Module-failover-Roadmap
- Module-geo-Roadmap
- Module-governance-Roadmap
- Module-gpu-Roadmap
- Module-graph-Roadmap
- Module-image-analysis-Roadmap
- Module-importers-Roadmap
- Module-index-Roadmap
- Module-ingestion-Roadmap
- Module-llama-cpp-Roadmap
- Module-llm-Roadmap
- Module-llm-streaming-Roadmap
- Module-llm-wiki-Roadmap
- Module-maintenance-Roadmap
- Module-metadata-Roadmap
- Module-network-Roadmap
- Module-observability-Roadmap
- Module-onnx-clip-Roadmap
- Module-performance-Roadmap
- Module-plugins-Roadmap
- Module-process-Roadmap
- Module-projects-Roadmap
- Module-prompt-engineering-Roadmap
- Module-query-Roadmap
- Module-rag-Roadmap
- Module-replication-Roadmap
- Module-retrieval-Roadmap
- Module-rpc-grpc-Roadmap
- Module-scheduler-Roadmap
- Module-scraper-Roadmap
- Module-search-Roadmap
- Module-security-Roadmap
- Module-server-Roadmap
- Module-sharding-Roadmap
- Module-stable-diffusion-Roadmap
- Module-storage-Roadmap
- Module-temporal-Roadmap
- Module-tensor-Roadmap
- Module-themis-Roadmap
- Module-timeseries-Roadmap
- Module-toolbox-Roadmap
- Module-training-Roadmap
- Module-transaction-Roadmap
- Module-updates-Roadmap
- Module-user-storage-encrypted-Roadmap
- Module-utils-Roadmap
- Module-vector-search-Roadmap
- Module-voice-Roadmap
- Module-whisper-Roadmap