This document describes exactly how VaultPassword protects your data: which algorithms are used, which secrets exist and where they live, what our servers can and cannot read, and — just as importantly — what this design does not protect you against.

It is written to be verifiable rather than reassuring. Where the current implementation falls short of the design, that is stated plainly in Known limitations.

1. Two different secrets

Most confusion about password managers comes from collapsing two separate things into one. VaultPassword keeps them strictly apart:

The consequence is the point of the whole design: somebody who steals our database, or who compels us to hand it over, gets encrypted blobs and no way to open them. Breaking the account password gets an attacker into an account whose contents they still cannot read.

2. The master key

Your master key is 32 bytes (256 bits) drawn from the operating system's cryptographically secure random generatorcrypto.getRandomValues in the browser, the system CSPRNG on Android — and shown to you encoded in base64.

It is not a password you choose, and that is deliberate. A human-chosen passphrase is guessable: an attacker with the encrypted vault can run a dictionary against it offline, at billions of attempts per second, which is why other products need deliberately slow key derivation (PBKDF2 with hundreds of thousands of iterations, or Argon2) to make each guess expensive.

There is no dictionary for 256 random bits. Guessing it is not a matter of better hardware; it is not possible. This is why VaultPassword derives with HKDF-SHA256 rather than a slow KDF: HKDF is the correct primitive for deriving keys from a secret that already has full entropy, and slowing it down would buy nothing.

The trade-off is honest and it is yours to accept: you have to store that key somewhere. If you lose it, your vault is unrecoverable — see section 7.

3. Proving you know the key, without sending it

Your apps need to check that the master key you typed is the right one. The naive way — send it to the server and compare — would defeat the entire design.

Instead, your device derives two independent values from the master key:

The literal prefix is domain separation: it guarantees the verifier can never coincide with any other value derived from the same key, now or in any future feature.

So an attacker who steals the database and breaks bcrypt obtains something that lets them authenticate — and still cannot decrypt a single stored password, because the verifier is a one-way function of the key and not the key itself.

4. How an item is encrypted

Each vault item is sealed into a single authenticated blob:

The stored value looks like v2.<nonce>.<ciphertext+tag>. The format is identified by that explicit prefix and by a format_version column, never by guessing at the content.

Why GCM specifically

AES-GCM is authenticated encryption: it carries a tag that makes tampering detectable. If a single byte of your data is altered — by a malfunctioning disk, a bug, or a hostile server — decryption fails loudly.

Unauthenticated encryption does not fail. It returns garbage, or an empty string, and an application that treats an empty string as "this field was blank" will happily overwrite good data with nothing. Silent corruption is worse than an error, because nobody notices it until the backups have rotated.

Verify before overwrite

Whenever an item is re-encrypted, the new blob is decrypted again and compared against the original before anything is written. If they differ, the write is abandoned and the original is left untouched. A snapshot of the previous state is also retained server-side as a second line of defence.

5. What our servers can see

For an item in the current format, the server holds an opaque blob and the following, which it genuinely needs in order to function:

It cannot see: any password, any username or email stored inside an item, any site or URL, any note, any custom field, any TOTP secret, the name you gave an item, or your master key.

Metadata is not nothing, and we are not going to pretend otherwise: knowing that you have 140 items and that one of them changed this morning is information. But it is information about the shape of your vault, not its contents.

6. Where decryption happens

Decryption happens only inside the app or the extension, in the process that holds the master key.

This matters most for Android autofill. When another app or a browser asks VaultPassword to fill a login, the system briefly connects to a background service of ours. That service never decrypts anything — it cannot, it does not have the key. It returns placeholder entries; when you tap one, VaultPassword itself opens, decrypts the item in its own process, and hands back only the two fields being filled.

The alternative — decrypting the vault in the background service so entries appear pre-filled — is more convenient and puts your plaintext credentials in a process that other applications can trigger. We did not do that.

The same rule governs search. Because the server cannot read item names or URLs, matching a site to your saved logins is done on your device, against the decrypted vault.

7. There is no recovery

If you lose your master key, your vault is gone. Not "difficult to recover" — gone. We cannot reset it, we cannot recover it, and no support request can change that, because we never had it.

This is not a missing feature. Any mechanism that let us restore your vault would, by definition, be a mechanism by which we could read it — and would be available to anyone who compromised or compelled us. A recovery option and a zero-knowledge design cannot both be true.

Store your master key somewhere durable and offline before you rely on VaultPassword for anything important. Resetting your account password does not affect your master key; they are independent.

8. Account security

9. Analytics

We collect anonymous usage statistics through a self-hosted analytics instance. What is sent is limited to which screens are opened and which features are used, plus platform and application version.

What is never sent, by design and not by policy: vault contents, item names, site URLs or domains, usernames, email addresses, account identifiers, or device identifiers. Analytics can be turned off in settings.

10. What this does not protect you from

No encryption design protects against everything. These are the cases where VaultPassword will not save you:

11. Known limitations

This section exists because a whitepaper that only describes the intended design is marketing. These are the gaps between the design above and what is deployed today.

12. Sharing

Sharing an item never involves handing over your master key, and never lets our servers read what you shared. It works in three layers:

The honest limit. You receive the recipient's public key from us. A compromised or coerced server could hand you a different one and read what you share. Cryptography cannot close that hole on its own — which is why both apps display a six-group fingerprint of every key. Comparing it with the other person over a different channel, once, is what closes it.

Losing your master key also loses access to shared items, since it is what protects your private key. The same rule as section 7, for the same reason.

13. Emergency access

You can name someone as an emergency contact. If they request access and you do not deny it within a waiting period you choose, they get in.

This is built on the same envelope as sharing: your master key, wrapped with their public key. We never see it. But the design has two properties you should understand before you use it, and we would rather you read them here than discover them later.

If neither of those is acceptable for your threat model, do not use the feature. It exists because "my family cannot get to anything if I die" is a real problem, and an honest imperfect answer beats no answer.

14. Reporting a vulnerability

If you find a security problem, please report it privately to [email protected] before disclosing it publicly, and give us a reasonable window to fix it.

We would rather receive an uncomfortable report than not receive it. If you believe something on this page is inaccurate, that is also worth an email.