Security & encryption model
A plain-language description of exactly how your vault is encrypted, what our servers can and cannot see, and what happens if you forget your password. Everything below reflects how the product actually works.
Key derivation
Your encryption key is derived from your master password on your device, using the Web Crypto API. The key is never transmitted or stored.
- Key derivation function
- PBKDF2 (HMAC-SHA-256)
- Iterations
- 100,000
- Derived key
- AES-GCM, 256-bit
- Salt
- 16 bytes, random per encryption
- Initialization vector
- 12 bytes, random per encryption
A fresh random salt and IV are generated for every item that is encrypted, and both are stored alongside the ciphertext so the item can be decrypted later with your master password.
What is encrypted on your device
The following is encrypted in your browser before anything is sent to our servers:
- lock Vault item contents — the passwords, notes, and other secret fields of every entry, encrypted with your master-password-derived AES-256-GCM key.
- key Your shared-vault private key — an ECDH P-256 private key, encrypted under your master password before it is stored. It is used to unwrap the keys of vaults shared with you.
- group Shared vault keys — each shared vault has its own AES-256 key, which is wrapped (encrypted) individually for each member using their public key, so only members can decrypt it.
What our servers store
Zero-knowledge applies to your vault contents and encryption key — not to every piece of data. To run the service, our servers do store the following, but none of it exposes your vault:
| Stored | Form |
|---|---|
| Account password | A one-way bcrypt hash, used only to verify sign-in. The plain-text password is never stored. |
| Vault items | Opaque AES-256-GCM ciphertext. Without your master password it cannot be decrypted. |
| 2FA secret & recovery codes | Encrypted at rest with the server key so login codes can be verified. Required for two-factor authentication to work. |
| Shared-vault public key | Your ECDH public key (public by design) plus your encrypted private key. |
| Account & activity data | Email address, and security activity logs (IP, browser, action, timestamp) retained for a limited period for account security. |
Your master password and how it's handled
Your account password and your vault master password are the same secret. That has one important consequence worth being precise about:
At sign-in, your password is sent to our server over HTTPS so it can be checked against the stored bcrypt hash. We verify it and discard it — it is never written to disk in plain text.
When unlocking your vault, your password is used entirely in your browser to derive the AES key. That step involves no server round-trip, and the derived key never leaves your device.
The bcrypt hash used for sign-in and the PBKDF2 key used to encrypt your vault are separate one-way derivations. The stored hash cannot be used to recover your password or to derive your vault key.
Password reset & recovery
This is the most important trade-off of a zero-knowledge design, so we want to be direct about it.
A password reset does not recover your vault. The "forgot password" flow sends a signed, time-limited link that lets you set a new account password. Because your vault items were encrypted with the key derived from your old master password — which we never had — items saved before the reset can no longer be decrypted. The reset restores account access, not vault data.
- block We cannot recover, reset, or read your master password, and we cannot decrypt your vault on your behalf. There is no back door and no key escrow.
- sync_saved_locally To change your master password without losing data, use the in-app change flow while signed in. Your browser re-encrypts every item under the new password and verifies your current password first — the server only ever receives the re-encrypted ciphertext.
- logout Resetting your password also signs out all existing sessions, so a previously compromised session is invalidated.
Reporting a security issue
Found a vulnerability? Email support@zerovault.nl with "Security" in the subject line. Please give us time to ship a fix before public disclosure.