Security Architecture
We believe in transparency over trust. This page documents the technical details of how Legacy Key protects your data.
We Never Store Your Seeds or Private Keys
Legacy Key only documents where your backups are located and how to access them — never the actual seed phrases or private keys themselves. This is by design: your seeds should never be entered into any online system.
Encryption by Plan
Every Legacy Key account uses zero-knowledge encryption. Your data is encrypted in your browser before it ever reaches our servers — we cannot see it, even if we wanted to.
| Plan | Encryption | Password Reset | Recovery |
|---|---|---|---|
| Personal Backup | Zero-Knowledge Encryption | Clears encrypted data | LK- Recovery Key |
| Recovery | Zero-Knowledge Encryption | Clears encrypted data | LK- Recovery Key |
| Legacy | Zero-Knowledge Encryption | Clears encrypted data | LK- Recovery Key + Inheritance |
Zero-Knowledge EncryptionAll Plans
How It Works
- 1Your password and email are combined locally in your browser — they never leave your device in plaintext.
- 2We run them through PBKDF2 with 600,000 iterations to derive a master key. This intentionally slow process makes brute-force attacks impractical.
- 3The master key (which is never stored anywhere) unwraps a symmetric key (AES-256-GCM) that encrypts and decrypts all of your data.
- 4Only the encrypted result is sent to our servers. We never see your password, master key, or plaintext data.
Your password never leaves your browser. Instead, we derive an encryption key from it locally, then use that key to encrypt your data before sending it to our servers.
What ZKE Protects Against
Trust Model
Your Browser (Trusted)
- Your password
- Encryption keys
- Plaintext data
Our Server (Untrusted)
- Only ciphertext
- No encryption keys
- Cannot decrypt your data
All communication between your browser and our servers is encrypted in transit via HTTPS/TLS.
Key Rotation & Envelope Versioning
Every encrypted record carries a versioned binary envelope identifying the algorithm and key generation used to seal it. That metadata lets us upgrade the underlying primitives without touching plaintext — your data is re-sealed transparently the next time it's decrypted with a current key.
- Automatic rotation on password reset: When you reset your password, your symmetric key is re-derived and every encrypted entity is re-sealed under the new key.
- Copy-on-write per-entity ciphertext: Rotations write new envelopes alongside the old ones and atomically swap pointers on success. A failed or aborted rotation leaves your data fully intact under the previous key — there is no in-place mutation that can corrupt your vault.
- Resumable: Long rotations check in their progress, so an interruption (closed tab, lost connection) picks up where it left off rather than restarting.
Recovery KeyAll Plans
Your Password = Your Data
With zero-knowledge encryption, we cannot reset your password or recover your data. If you forget your password and lose your Recovery Key, your data is gone forever. This is the tradeoff for maximum privacy.
Recovery Key
- Format: Crockford Base32 alphanumeric code (LK-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX)
- Entropy: 128 bits of cryptographically random data
- Generated locally: Your code is created in your browser and never sent to our servers
- One-time display: You'll see it once during setup — write it down and store it securely
We do not recover accounts with a 24-word BIP39 phrase. The Recovery Key is the only cryptographic path back into your data if you forget your password.
Trusted Contact CustodyLegacy
What if you lose both your password and Recovery Key? With the Legacy plan, your trusted contacts become your safety net.
- Designate trusted contacts with inheritance access
- After a configurable inactivity period (30-365 days), they receive read-only access
- Any login resets the timer — you stay in control
- Works even if you lose everything — protects against the worst-case scenario
Cryptographic Specifications
| Operation | Algorithm | Parameters |
|---|---|---|
| Key Derivation | PBKDF2-HMAC-SHA-256 | 600,000 iterations (OWASP 2025 recommendation) |
| Symmetric Encryption | AES-256-GCM | 96-bit IV, 128-bit auth tag |
| Asymmetric Encryption | RSA-OAEP | 4096-bit modulus, SHA-256 |
| Password Hashing | bcrypt | Cost factor 13 |
| Salt Derivation | SHA-256 | Email (normalized, lowercase) |
What's Encrypted
The following sensitive fields are encrypted at rest. With zero-knowledge encryption on all plans, this encryption happens in your browser — we never see the plaintext.
What the Server Can Never SeeZKE Users
With zero-knowledge encryption enabled, our servers store only ciphertext. Even with full database access, we cannot see:
- ×Where your seed backups are located
- ×Your trusted contacts' real names and details
- ×Wallet configuration and inheritance instructions
- ×Document contents and file names
- ×Multisig recovery procedures
- ×Any notes or descriptions you've written
What's Not Encrypted
The following fields remain in plaintext for functionality (searchable, displayable without decryption):
Other Security Measures
Password Security
- Requirements: Minimum 12 characters with uppercase, lowercase, number, and special character
- Hashing: Bcrypt with cost factor 13 (8,192 iterations)
- Failed login tracking: Email alerts after 3 failed attempts with IP and device details. Failed login logs use HMAC-SHA-256 keyed hashing — our system can block brute-force attacks without ever storing which email was targeted
- Reset tokens: Cryptographically secure, expire after 30 minutes
Two-Factor Authentication
- TOTP-based: Works with most modern authenticator apps (Google Authenticator, Authy, 1Password, Raivo). New enrollments use SHA-256 as the TOTP hash algorithm — stronger than the SHA-1 default in RFC 6238
- Backup codes: 10 one-time recovery codes generated during setup, each carrying 80 bits of entropy and formatted as five hexadecimal groups (XXXX-XXXX-XXXX-XXXX-XXXX). Displayed only once, so save them securely
- Flexible verification: Use either your authenticator app or a backup code to log in
- Brute-force protection: Account locked for 15 minutes after 5 failed attempts (both TOTP and backup codes count)
- Secret storage: MFA secrets encrypted with AES-256-GCM. Backup codes hashed with PBKDF2 (600,000 iterations) using unique salts
- Device trust: Optionally remember trusted devices for 30 days using secure __Host- prefixed cookies — skip MFA on recognized devices while maintaining full security. Trust automatically expires after 30 days of account inactivity, forcing a full re-authentication on next login
- Step-up re-authentication: Even on a trusted device, sign-ins flagged as high-risk by our anomaly engine require fresh MFA before the session is granted
Session Security
- Cookie protection: HttpOnly, Secure, SameSite=Strict with __Host- prefix
- Rolling sessions: Session extends on activity, expires after 1 hour of inactivity, and has an absolute maximum lifetime of 8 hours regardless of activity
- Session regeneration: New session ID on login to prevent fixation attacks
- Active session management: View and revoke sessions from any device
- Automatic invalidation: All sessions revoked on password change or reset
- Redis-backed storage: Sessions stored in Redis with automatic TTL expiration — no session data persists in the primary database
Rate Limiting
- Login attempts: 5 per 15 minutes per email address
- Password reset: 5 requests per 15 minutes per email address (shares the login rate limiter)
- Sensitive operations: 5 per hour (password change, MFA changes, account deletion)
- API protection: All endpoints protected against abuse
Security Headers
- Content Security Policy (CSP): Restricts resource loading to trusted sources, no inline scripts
- HSTS: Enforces HTTPS with 1-year max-age and preload
- X-Frame-Options: DENY prevents clickjacking attacks
- CSRF protection: Origin/Referer validation on all state-changing requests
Audit Logging
- Tracked events: Logins, password changes, MFA changes, session revocations, data exports
- Log details: User ID, action, IP address, timestamp, and context
- Email alerts: Notifications for security-relevant account activity
- Encrypted for ZKE users: Entity names and change details in audit logs are encrypted — even your activity history is private
Infrastructure & Data Protection
- Database: PostgreSQL with SSL/TLS encrypted connections
- SQL injection prevention: All queries use parameterized statements
- Input validation: Type checking, length limits, and format validation on all inputs
- File storage: AWS S3 with server-side encryption, bucket-level access controls, public access blocked
- File uploads: Per-entity size limits enforced server-side — 10 MB for seed backups, 25 MB for wallet documents (includes ZKE ciphertext overhead), and 1 MB for multisig configuration files. All uploads are validated for file type and assigned unique storage keys
- Payments: Stripe handles all payment processing, no card data stored locally
- Logging: No sensitive data in logs. All internal notifications and audit logs use aggressive data masking — developers and automated systems only see masked email addresses (e.g., j***@domain.com), preventing accidental exposure
- Real-time breach detection: Live login traffic is continuously scored for credential-stuffing patterns (many distinct emails from one IP), distributed brute force (one email targeted from many IPs), and impossible-travel geolocation. Suspicious sources are auto-blocked, high-risk sign-ins are gated behind a step-up MFA re-verification, and on-call is paged on critical anomalies. Separately, monitored canary accounts seeded across the database act as silent tripwires — any unsolicited contact triggers an immediate breach alert
- Email encryption at rest: User email addresses are encrypted with AES-256-GCM and queryable only via HMAC-SHA-256 blind index — even our database doesn't store plaintext emails
- Schema validation: All API inputs validated with Zod schemas — malformed requests are rejected before reaching any business logic
- Service resilience: Circuit breakers on external services (email, file storage, payments) ensure the app remains responsive even when downstream services degrade
Data Deletion & Your Rights
You have full control over your data. When you delete your account, all your personal data is permanently removed. Billing records are retained for 7 years as required for tax and accounting compliance — these contain no wallet data, encryption keys, or personal content.
- All wallets and associated data (seed backups, verifications, accounts, documents)
- All trusted contacts and sharing relationships
- Multi-signature configurations
- User-defined brands and locations
- All uploaded files (S3 storage)
- Audit logs and session history
- Subscription and billing records
Reporting Vulnerabilities
If you discover a security vulnerability, please report it privately. We take all reports seriously and will respond promptly.
Please include:
- Description of the vulnerability
- Steps to reproduce
- Potential impact
Our commitment:
- Acknowledgment within 48 hours
- Initial assessment within 7 days
- We will not take legal action against good-faith researchers
Questions About Our Security?
We welcome questions from security researchers and users who want to understand our implementation in more detail.
Contact Us