Vault — zaszyfrowane sekrety#
Vault to drugie serce Memphis. To tu żyją passphrase'y, API keys, tokeny, klucze prywatne — wszystko czego utrata oznacza kompromitację operatora.
Prymitywy kryptograficzne#
- Szyfrowanie symetryczne: AES-256-GCM (autentykowane, 96-bit nonce, unikalny na zapis).
- Derywacja klucza z passphrase: Argon2id (memory-hard, domyślne parametry
m=64MiB, t=3, p=1). - Integralność całego vaultu: BLAKE3 nad sealed-state (szybszy niż SHA-2, wolny od długości fixed-length attacks).
Dwa tiery#
| Tier | Co trzyma | Passphrase |
|---|---|---|
| Tier 1 — Daily ops | API keys, tokeny, webhooks, bieżące sekrety | unlock przy starcie serwisu |
| Tier 2 — Critical | klucz tożsamości agenta (ed25519), self-mod permissions, vault-admin | explicit prompt każdorazowo |
Tier 2 nigdy nie jest cached. Każde odczytanie wymaga re-entry passphrase'u. To bariera między "runtime pracuje" a "runtime się modyfikuje / autoryzuje ryzykowne narzędzie".
Flow unlock#
passphrase (input)
│
▼
Argon2id ────► key (32B)
│
▼
AES-256-GCM decrypt(vault.enc)
│
▼
sealed state (JSON)
│
▼
BLAKE3 verify
│
▼
vault ready
Jeśli weryfikacja BLAKE3 zawodzi — vault jest tampered, Memphis odmawia startu, event vault.integrity.breach ląduje w ops chain.
Rotation#
memphis vault rotate-master # nowy passphrase, re-encrypt całego vaultu
memphis vault rotate-domain <domain> # nowy klucz per-domenę, stare bloki unreadable
Rotation domenowy jest właściwą metodą "GDPR shreddingu" — stare bloki chaina dalej istnieją, ale klucz do nich jest zniszczony.
Co NIE trafia do vaultu#
- Contentu chainów samego w sobie (chain ma własne encryption per-domain).
- Outputów LLM podczas inferencji (transient).
- Cache RAG (łatwo regenerowalny, nie warto pamięciożernego Argon2id przy każdym reindex).