Knowledge Base
Security Architecture

Security Architecture

An overview of the cryptographic primitives, key hierarchy, security controls, and server-side storage model.

Cryptographic Primitives

PrimitiveAlgorithmKey SizePurpose
Symmetric encryptionAES-256-GCM256-bitEncrypt item data, item names, folder names, private keys
Asymmetric encryptionRSA-OAEP-SHA2564096-bitWrap vault keys for shared vault members
Symmetric key wrapAES-256-KW (RFC 3394)256-bitWrap vault keys for personal vaults
Key derivationArgon2id256-bit outputDerive master key from master password
Key expansionHKDF-SHA256256-bit outputDerive auth hash and stretched key from master key
Digital signatureEd25519256-bitSign public keys and vault key wraps
Server auth hash storageArgon2id256-bit outputRe-hash client auth hash before storing
TOTPHMAC-SHA1160-bitTime-based one-time passwords (RFC 6238)

Key Hierarchy

                    Master Password


                ┌─────────────────┐
                │    Argon2id     │  salt (16B random, stored on server)
                │ 3 iter / 64MB  │  parallelism: 4
                └────────┬────────┘

                    Master Key (256-bit)

              ┌──────────┴──────────┐
              │                     │
              ▼                     ▼
     HKDF(info="auth")    HKDF(info="enc")
              │                     │
              ▼                     ▼
        Auth Hash              Stretched Key
     (sent to server)      (never leaves browser)
              │                     │
              ▼                     ├── AES-256-GCM → Encrypted RSA Private Key
     ┌─────────────────┐           │
     │ Server Argon2id  │           └── AES-256-GCM → Encrypted Ed25519 Private Key
     │ 2 iter / 19MB   │
     └────────┬────────┘
              │                RSA Private Key
              ▼                     │
     Stored Hash                    ▼
     (in database)         RSA-OAEP unwrap of
                           shared vault keys


                              Vault Key (256-bit)

                         ┌──────────┴──────────┐
                         │                     │
                         ▼                     ▼
                  AES-256-GCM            AES-256-GCM
                  (item data)          (item/folder names)

Key Types

KeyGeneratedStoredProtected By
Master KeyDerived from password + saltNever storedExists only in memory during session
Auth HashHKDF from master keyServer (double-hashed)Argon2id (client) + Argon2id (server)
Stretched KeyHKDF from master keyNever storedExists only in memory during session
RSA Keypair (4096-bit)At registrationPrivate: encrypted on server. Public: plaintext on serverAES-256-GCM with stretched key
Ed25519 KeypairAt registrationPrivate: encrypted on server. Public: plaintext on serverAES-256-GCM with stretched key
Vault Key (256-bit)At vault creationWrapped on server (per member)RSA-OAEP (shared) or AES-256-KW (personal)

Security Controls

IDControlLayerDescription
C1Client-side encryptionCryptoAll sensitive data encrypted in the browser with AES-256-GCM before transmission
C2Dual Argon2idCryptoClient derives auth hash via Argon2id; server re-hashes with second Argon2id before storage
C3Signed key wrapsCryptoEd25519 signatures on vault key wraps prevent man-in-the-middle during sharing
C4AAD bindingCryptoCiphertext bound to context (vault ID, item ID, field type) via AES-GCM AAD
C5Name paddingCryptoPKCS#7 padding to 32-byte boundaries prevents length fingerprinting
H2Enumeration preventionAuthPrelogin returns deterministic fake KDF params for unknown emails
H3Account lockoutAuth5 consecutive failures triggers 15-minute lockout
H4Token hygieneAuthAccess tokens: short-lived (15 min). Refresh tokens: single-use with rotation
H5Step-up authenticationAuthSensitive operations require re-verification with 5-minute expiry
H6TOTP replay protectionAuthPer-time-step code tracking rejects replayed codes
H7IDOR preventionAuthzVault membership verified on every resource access
H8XSS mitigationTransportStrict CSP, Web Worker key isolation, no inline scripts
H9Clickjacking preventionTransportX-Frame-Options: DENY, frame-ancestors 'none'
H10Rate limitingTransportPer-IP (60/min) and per-email (5/15min) rate limits
H11Log redactionOpsConfigurable field list redacted from server logs

What the Server Stores

DataEncrypted?Notes
EmailNoRequired for authentication
Display nameNoUser profile
Auth hashHashedDouble Argon2id — not reversible to master password
SaltNoNeeded for client-side key derivation
KDF parametersNoIterations, memory, parallelism
RSA public keyNoUsed for vault key wrapping during sharing
Ed25519 public keyNoUsed for signature verification
Public key signatureNoEd25519 signature over RSA public key
Encrypted RSA private keyYes (AES-256-GCM)Only decryptable with stretched key
Encrypted Ed25519 private keyYes (AES-256-GCM)Only decryptable with stretched key
Vault namesNoPlaintext for server-side listing
Vault typesNopersonal or shared
Encrypted vault keysYes (RSA-OAEP or AES-KW)Per-member wrapped vault keys
Wrap signaturesNoEd25519 signature over wrapped key
Item typesNologin, note, card, etc.
Encrypted item dataYes (AES-256-GCM)Ciphertext blob
Encrypted item namesYes (AES-256-GCM)Padded and encrypted
Encrypted folder namesYes (AES-256-GCM)Padded and encrypted
TimestampsNoCreated, updated, trashed dates
TOTP secretsYes (AES-256-GCM)Server-side encrypted with DATA_ENCRYPTION_KEY
Refresh tokensHashedSHA-256 hashed before storage
Session metadataNoDevice name, IP, last active time