Dental Platform · Internal Docs
ArchitectureDecision records (ADR)

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).

On this page