Settings
OBSCURA Keep

What Keep protects against, and what it does not

Keep encrypts your papers, passwords and codes on your own device before anything is stored. That stops a long list of things. It cannot stop everything, and a security product that does not say where it stops is asking to be trusted further than it should be. This page says both, in plain words. Where it and Keep’s own page ever disagree, this page is the careful one.

What it protects against

What it does not protect against

The details

PartWhat is used
Passphrase to keyArgon2id (version 1.3, the reference code compiled to WebAssembly by hash-wasm 4.12.0), 64 MiB, 3 passes, 1 lane, a random 16-byte salt, 32 bytes out. Where WebAssembly is switched off, PBKDF2-HMAC-SHA-256 at 600,000 iterations. The parameters are stored with the Keep, so they can be raised for new passphrases without breaking old Keeps.
The vault key32 random bytes from the browser’s generator, made once. Wrapped with AES-256-GCM under the passphrase’s key, and again under the recovery key’s, each with the Keep’s id and the slot’s name as additional data. Changing the passphrase wraps it again; nothing else is re-encrypted.
Recovery key160 random bits, stretched with HKDF-SHA-256 and a random salt (it is already random, so it needs no Argon2), written as 32 characters of Crockford base32 and a 4-character check.
PasskeyOptional. WebAuthn’s PRF extension, with user verification required: the authenticator’s 32 bytes for a random 32-byte salt go through HKDF-SHA-256, salted with the Keep’s id and bound to the credential, to a key that wraps the vault key with AES-256-GCM in a slot of its own. Nothing is sent to a server; there is none. Adding one asks for the passphrase, which is checked before the authenticator is asked.
DataThe data key comes from the vault key by HKDF-SHA-256. Every stored part (the index, each document, each thumbnail) is AES-256-GCM with a fresh random 96-bit IV and a 128-bit tag, the Keep’s id, the part’s kind and its id as additional data.
StorageThe browser’s private file system for this site (an IndexedDB database where a page cannot write those files). Nothing unencrypted is written to local storage, the database or the offline cache.
PackagesThe same format, with a fresh vault key and a passphrase of their own, opened read-only at /keep-open.
Two-step codesTOTP, RFC 6238, with HMAC from WebCrypto.
Travel modeA new 32-byte vault key; the items that travel and their files decrypted with the old key and encrypted again with the new, AES-256-GCM as above; the header has the travel passphrase’s slot alone; every other part of the Keep, and any other Keep not kept, removed from the private file system or IndexedDB, once a backup file of each has been saved. Coming home puts the backup back over it and merges in what changed while away.
Shares that stopThe expiry and the single opening are in the package’s header and in the additional data its key is wrapped with (“pass|limits|until=…|once”), so a header with either changed does not unwrap.
Moving by QR codeECDH on P-256 with keys made for one move; HKDF-SHA-256, salted with both public keys, to an AES-256-GCM key and, apart, a six-digit check; the item compressed and sealed, and shown as up to ten codes in turn.
Reading a KeePass databaseKDBX 4: SHA-256 of the master password, Argon2d, Argon2id or AES-KDF as the file says (held within real costs), the header’s HMAC checked first, each block’s HMAC before its bytes are used, AES-256-CBC or ChaCha20, then the protected values revealed with ChaCha20. On the device; the file is not kept.

Each of these is checked by the site’s own tests: published test vectors for AES-GCM, HKDF, PBKDF2, Argon2id, TOTP, ChaCha20 and AES-256; KeePass databases written by another program; travel mode’s removal looked for in the browser’s storage itself; a share with its limits edited out refused; a wrong passphrase refused; a tampered part caught; a passphrase change, a recovery key and a passkey (through a virtual authenticator) that still open the same data; and a search of every kind of browser storage, after a known secret is added, that finds no trace of it. For the site as a whole, see the threat model for every tool and /trust.