Docs / Security / Encryption model
Encryption model
What happens to a secret between your disk and our database.
- A random 256-bit key is generated for each secret.
- The value is padded to a 32-byte bucket and sealed with AES-256-GCM using a random 96-bit nonce.
- Project, environment, service, key name and revision are bound to the ciphertext as authenticated data.
- The secret's key is wrapped for each reader: ephemeral X25519, HKDF-SHA-256, AES-256-GCM.
- The server stores the ciphertext, the nonce, the auth tag and one wrapped key per reader.
Local change detection
The CLI keeps a keyed hash of each value you pushed or pulled in ~/.storeenv/projects. The hash key never leaves your machine, so status works without decrypting anything and without sending guessable hashes to the server.