Documentation Menu
Security Model
W2QR’s threat model, key lifecycle, and honest trade-offs.
Threat model
W2QR protects against an attacker who obtains your QR code — whether by stealing the paper, intercepting a photo, or accessing your cloud storage. The attacker may also have unlimited computing resources to brute-force passwords.
W2QR does not protect against:
- - Malware on your device at the time of encryption or decryption
- - Shoulder surfing / someone watching you type your password
- - A compromised browser or operating system
No password verifier
This is W2QR’s strongest security guarantee. There is no stored hash, MAC, known plaintext, AEAD tag, wallet address, or any other artifact that lets someone check if a password is correct without going to the blockchain.
Every password decrypts to a valid BIP-39 seed phrase. To find the real one, the attacker must derive wallet addresses from each candidate and check them on-chain — economically infeasible at scale.
Client-side only
All cryptographic operations happen in your browser. The W2QR server never receives:
- - Your password
- - Your seed phrase (mnemonic)
- - Your private keys
- - Your wallet addresses
In Advanced mode, the server stores only encrypted material (KEK-wrapped secrets) and shares — none of which are useful without your password or a second factor.
Key lifecycle
Trust domains
The system is designed so that no single trust domain can access your wallet:
| Domain | Knows | Cannot access |
|---|---|---|
| You | Password, Recovery Code, QR | Server KEK |
| Google Account / W2QR server | Wrapped S, R1 share | Password, mnemonic, private keys |
| Device | PRF-encrypted S, R2 | Server data, Recovery Code |
| QR thief | Ciphertext only | Password, S, all shares |
Honest trade-offs
Rate limiting
Server-side API routes that release encrypted secrets are rate-limited per user, per wallet, and per IP address. This prevents online brute-force attempts against the authorization factor. All access attempts are audit-logged.