# Secrets (encrypted secret store + `${secret:}` resolution) Normalizes how the family stores and consumes secrets — SQL/login passwords, API-key HMAC peppers, LDAP bind passwords, connection strings, TLS material — which are handled ad-hoc and inconsistently across the three apps today (Data-Protection-encrypted connection strings in ScadaBridge; peppers/passwords in environment variables; LDAP passwords in `appsettings`). The goal is the shared **`ZB.MOM.WW.Secrets`** library: AES-256-GCM envelope encryption at rest, a pluggable master-key provider and store, an audited `ISecretResolver` + `${secret:name}` config expander for app runtime, and a Blazor `/admin/secrets` management UI. The library is **built, published (0.1.2), and live-proven** via its reference consumer; per-app adoption is the tracked follow-on. - **Target:** [`spec/SPEC.md`](spec/SPEC.md) - **Realized API:** [`shared-contract/ZB.MOM.WW.Secrets.md`](shared-contract/ZB.MOM.WW.Secrets.md) - **Implementation:** [`../../ZB.MOM.WW.Secrets/`](../../ZB.MOM.WW.Secrets/) · design [`docs/plans/2026-07-15-secrets-manager-design.md`](../../docs/plans/2026-07-15-secrets-manager-design.md) - **Adoption backlog:** [`GAPS.md`](GAPS.md) ## Status | | State | |---|---| | Library | **Built + published** — `ZB.MOM.WW.Secrets{,.Abstractions,.Ui}` 0.1.2 on the `dohertj2-gitea` feed; `.Cli` in-repo (not packed); `.Akka` replicator **deferred** (design only) | | Reference consumer | **HistorianGateway — adopted + live-proven** (2026-07-16): historian password sourced via `${secret:}`, authenticated read against the real wonder historian | | Three sister apps | **Not yet adopted** — see per-app current-state + GAPS | ## Per-project current state | Project | Today (baseline) | Doc | |---|---|---| | OtOpcUa | _(code-verified baseline)_ | [`current-state/otopcua/CURRENT-STATE.md`](current-state/otopcua/CURRENT-STATE.md) | | MxAccessGateway | _(code-verified baseline)_ | [`current-state/mxaccessgw/CURRENT-STATE.md`](current-state/mxaccessgw/CURRENT-STATE.md) | | ScadaBridge | _(code-verified baseline)_ | [`current-state/scadabridge/CURRENT-STATE.md`](current-state/scadabridge/CURRENT-STATE.md) | > Not applicable as a fourth adopter row but the exemplar: **HistorianGateway** already > consumes the lib — its wiring is the template the three apps follow (see the > shared-contract "Consumer wiring" section).