ADR 0016 — Encryption design
Status: Accepted
Owner: Platform EngineeringLast reviewed:
Status: Accepted · Date: 2026-07-23
Decision
Layers: TLS 1.3 (1.2 floor) everywhere; LUKS volume encryption on nodes;
PostgreSQL and MinIO at-rest encryption; pgBackRest AES-256 backup encryption;
and application-level envelope encryption for the highest-sensitivity fields
(health-card numbers, insurance member ids, medical/dental history free text,
phone/email of patients). Per-clinic AES-256-GCM DEKs wrapped by OpenBao
Transit KEKs (ADR 0009). Ciphertext format:
enc:v1:{key_id}:{base64(nonce||ciphertext||tag)}. Deterministic HMAC-SHA256
blind indexes (per-field salt from OpenBao) exist only for narrowly-scoped
exact-match lookups (health-card, member id, patient email) — no broad
plaintext PHI indexes. Patient name search uses normalized token columns kept
deliberately separate from encrypted contact/history fields and classified in
security/data-classification/. Key access is audited; rotation is supported
for KEK (re-wrap) and DEK (batch re-encrypt).