Skip to content

Zero-Knowledge Encryption - Visual Guide ​

The Guarantee ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  "Even if someone asked us to hand over user information,   β”‚
β”‚   we literally CANNOT provide it."                          β”‚
β”‚                                                              β”‚
β”‚  βœ… Cryptographically provable                              β”‚
β”‚  βœ… Legally defensible                                      β”‚
β”‚  βœ… User-controlled encryption                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

How Data Flows ​

Signup Flow ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    USER      β”‚
β”‚  (Browser)   β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β”‚ 1. Creates passphrase: "MySecretPass123!"
       β”‚    ↓
       β”‚    (NEVER transmitted, NEVER stored)
       β”‚
       β”‚ 2. Generates random salt
       β”‚    ↓
       β”‚    Salt = [random 32 bytes]
       β”‚
       β”‚ 3. Derives encryption key (client-side)
       β”‚    ↓
       β”‚    Passphrase + Salt β†’ PBKDF2(600k iterations) β†’ AES Key
       β”‚
       β”‚ 4. Encrypts birth date (client-side)
       β”‚    ↓
       β”‚    "1990-05-15" + Key β†’ "k2j3n4lk5j6h7g8f9d0s1a..."
       β”‚
       β”‚ 5. Sends to backend
       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
       β”‚                                       β”‚
       β–Ό                                       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   FIRESTORE     β”‚                   β”‚  WHAT BACKEND    β”‚
β”‚                 β”‚                   β”‚  RECEIVES:       β”‚
β”‚ encryptedData:  β”‚                   β”‚                  β”‚
β”‚ "k2j3n4lk5..."  │◄──────────────────│ βœ… Encrypted dataβ”‚
β”‚                 β”‚                   β”‚ βœ… Salt (public) β”‚
β”‚ salt:           β”‚                   β”‚                  β”‚
β”‚ "p9o8i7u6..."   β”‚                   β”‚ ❌ Passphrase    β”‚
β”‚                 β”‚                   β”‚ ❌ Encryption keyβ”‚
β”‚ lanternName:    β”‚                   β”‚                  β”‚
β”‚ "Amber Beacon"  β”‚                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

What Happens If Database Is Breached ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  HACKER STEALS DATABASE                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚
                    β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  Hacker gets:         β”‚
        β”‚                       β”‚
        β”‚  βœ“ Encrypted data     β”‚
        β”‚  βœ“ Salt               β”‚
        β”‚                       β”‚
        β”‚  βœ— Passphrase         β”‚ ← NEVER stored
        β”‚  βœ— Encryption key     β”‚ ← NEVER stored
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚
                    β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  Without passphrase:  β”‚
        β”‚                       β”‚
        β”‚  Encrypted data is    β”‚
        β”‚  GIBBERISH            β”‚
        β”‚                       β”‚
        β”‚  Brute force would    β”‚
        β”‚  take YEARS due to    β”‚
        β”‚  600k iterations      β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚
                    β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  Result:              β”‚
        β”‚  πŸ›‘οΈ  Users protected   β”‚
        β”‚  πŸ›‘οΈ  No PII leaked     β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

What Happens If Court Orders Data ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  COURT ORDER: "Provide all data for User ABC123"      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚
                    β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  Lantern provides:    β”‚
        β”‚                       β”‚
        β”‚  {                    β”‚
        β”‚    encryptedBirthDate:β”‚
        β”‚    "k2j3n4lk5j6h...", β”‚
        β”‚                       β”‚
        β”‚    salt:              β”‚
        β”‚    "p9o8i7u6y5t...",  β”‚
        β”‚                       β”‚
        β”‚    lanternName:       β”‚
        β”‚    "Amber Beacon",    β”‚
        β”‚                       β”‚
        β”‚    interests:         β”‚
        β”‚    ["Coffee", "Jazz"] β”‚
        β”‚  }                    β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚
                    β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  Legal stance:        β”‚
        β”‚                       β”‚
        β”‚  "We provided all     β”‚
        β”‚   data we possess.    β”‚
        β”‚                       β”‚
        β”‚   Birth date is       β”‚
        β”‚   encrypted. We do    β”‚
        β”‚   NOT store the       β”‚
        β”‚   encryption key.     β”‚
        β”‚                       β”‚
        β”‚   We CANNOT decrypt." β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚
                    β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  Result:              β”‚
        β”‚  βœ… Compliant         β”‚
        β”‚  βœ… User protected    β”‚
        β”‚  βœ… Provable stance   β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Key Comparison: Before vs After ​

BEFORE (Vulnerable Architecture) ❌ ​

USER                  BACKEND
  β”‚                      β”‚
  β”‚ Birth date:          β”‚
  β”‚ "1990-05-15"         β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚ Stores in database:
  β”‚                      β”‚   birthDate: "1990-05-15"
  β”‚                      β”‚
  β”‚                      β”‚ ⚠️ If hacked β†’ PII leaked
  β”‚                      β”‚ ⚠️ If subpoenaed β†’ must comply

AFTER (Zero-Knowledge) βœ… ​

USER                                    BACKEND
  β”‚                                        β”‚
  β”‚ Passphrase: "MySecretPass"            β”‚
  β”‚      ↓                                 β”‚
  β”‚   (derives key)                        β”‚
  β”‚      ↓                                 β”‚
  β”‚ Encrypts: "1990-05-15"                β”‚
  β”‚      ↓                                 β”‚
  β”‚ Ciphertext: "k2j3n4lk5j6..."         β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚ Stores:
  β”‚                                        β”‚   encrypted: "k2j3n4lk5..."
  β”‚ Salt: "p9o8i7u6..."                   β”‚   salt: "p9o8i7u6..."
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚
  β”‚                                        β”‚
  β”‚ Passphrase NEVER sent β”€β”€β”€βœ—β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”‚ Backend NEVER sees it
  β”‚                                        β”‚
  β”‚                                        β”‚ βœ… If hacked β†’ gibberish
  β”‚                                        β”‚ βœ… If subpoenaed β†’ can't decrypt

Trust Model ​

Traditional Apps ​

β”Œβ”€β”€β”€β”€β”€β”€β”                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ User │───Trust───────►│ Company  β”‚
β””β”€β”€β”€β”€β”€β”€β”˜                β”‚          β”‚
                        β”‚ "We'll   β”‚
                        β”‚  keep    β”‚
                        β”‚  your    β”‚
                        β”‚  data    β”‚
                        β”‚  safe"   β”‚
                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
                             β–Ό
                    ⚠️ Must trust company
                    ⚠️ Must trust employees
                    ⚠️ Must trust security
                    ⚠️ Must trust legal team

Lantern (Zero-Knowledge) ​

β”Œβ”€β”€β”€β”€β”€β”€β”                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ User β”‚                β”‚ Lantern  β”‚
β”‚      β”‚                β”‚          β”‚
β”‚ Only β”‚                β”‚ "We      β”‚
β”‚ YOU  β”‚                β”‚  CAN'T   β”‚
β”‚ have β”‚                β”‚  access  β”‚
β”‚ the  β”‚                β”‚  your    β”‚
β”‚ key  β”‚                β”‚  data"   β”‚
β””β”€β”€β”€β”€β”€β”€β”˜                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”‚                        β”‚
    └────── No trust β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           needed!
    
    βœ… Cryptographically guaranteed
    βœ… Mathematically provable
    βœ… No faith required

Security Properties ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Property                β”‚  Traditional  β”‚  Lantern     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Backend can decrypt     β”‚  βœ… Yes       β”‚  ❌ No       β”‚
β”‚  Employees can access    β”‚  βœ… Yes       β”‚  ❌ No       β”‚
β”‚  Survives database breachβ”‚  ❌ No        β”‚  βœ… Yes      β”‚
β”‚  Resists court orders    β”‚  ❌ No        β”‚  βœ… Yes      β”‚
β”‚  Password reset possible β”‚  βœ… Yes       β”‚  ❌ No*      β”‚
β”‚  User forgot pass = ?    β”‚  Can reset    β”‚  Data lost   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

* By design - this is the security tradeoff

What Gets Encrypted ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Data Type          β”‚  Encrypted?  β”‚  Why?              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Birth date         β”‚  βœ… Yes      β”‚  Age verification  β”‚
β”‚  Real name (if any) β”‚  βœ… Yes      β”‚  Legal requirement β”‚
β”‚  Interests          β”‚  ❌ No       β”‚  Social matching   β”‚
β”‚  Mood/vibe          β”‚  ❌ No       β”‚  Connection signal β”‚
β”‚  Lantern name       β”‚  ❌ No       β”‚  Public identifier β”‚
β”‚  Check-ins          β”‚  ⚠️ Partial  β”‚  Encrypted coords  β”‚
β”‚  Wave history       β”‚  ❌ No       β”‚  Social graph      β”‚
β”‚  Chat messages      β”‚  πŸ”„ TBD      β”‚  E2E encryption?   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Key:
βœ… Fully encrypted (zero-knowledge)
⚠️ Partially encrypted (some fields)
❌ Not encrypted (public/social data)
πŸ”„ To be determined

The Passphrase Rules ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Passphrase Requirements:              β”‚
β”‚                                        β”‚
β”‚  βœ“ At least 12 characters              β”‚
β”‚  βœ“ Contains uppercase letter           β”‚
β”‚  βœ“ Contains lowercase letter           β”‚
β”‚  βœ“ Contains number                     β”‚
β”‚  βœ“ Contains special character          β”‚
β”‚                                        β”‚
β”‚  Example good passphrase:              β”‚
β”‚  "Coffee&Jazz2025!"                    β”‚
β”‚                                        β”‚
β”‚  Example bad passphrase:               β”‚
β”‚  "password" ❌                         β”‚
β”‚  "12345678" ❌                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Why so strict?
  β†’ Passphrase is your ONLY key
  β†’ Lost passphrase = lost data
  β†’ Strong passphrase = secure data

FAQ Diagram ​

Q: What if I forget my passphrase? ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Forgot Pass? β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Can Lantern reset it?          β”‚
β”‚                                β”‚
β”‚ NO                             β”‚
β”‚                                β”‚
β”‚ Why not?                       β”‚
β”‚ β†’ Passphrase never stored      β”‚
β”‚ β†’ We don't know what it is     β”‚
β”‚ β†’ No "master key" exists       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Result:                        β”‚
β”‚                                β”‚
β”‚ Data is LOST                   β”‚
β”‚                                β”‚
β”‚ This is BY DESIGN              β”‚
β”‚ Security ← β†’ Convenience       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Mitigation:                    β”‚
β”‚                                β”‚
β”‚ βœ“ Backup codes (printed)       β”‚
β”‚ βœ“ Passphrase hints (encrypted) β”‚
β”‚ βœ“ Clear warnings at signup     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Implementation Status ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Component              β”‚  Status     β”‚  Location    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Encryption utilities   β”‚  βœ… Done    β”‚  lib/        β”‚
β”‚  Signup flow            β”‚  βœ… Done    β”‚  components/ β”‚
β”‚  Passphrase validation  β”‚  βœ… Done    β”‚  SignupFlow  β”‚
β”‚  Key derivation         β”‚  βœ… Done    β”‚  encryption  β”‚
β”‚  Data encryption        β”‚  βœ… Done    β”‚  encryption  β”‚
β”‚  Session key cache      β”‚  βœ… Done    β”‚  encryption  β”‚
β”‚  Documentation          β”‚  βœ… Done    β”‚  docs/       β”‚
β”‚  Storybook stories      β”‚  βœ… Done    β”‚  *.stories   β”‚
β”‚  Backend integration    β”‚  ⏳ TODO    β”‚  Firebase    β”‚
β”‚  Backup codes           β”‚  ⏳ TODO    β”‚  TBD         β”‚
β”‚  Security audit         β”‚  ⏳ TODO    β”‚  External    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Frontend: 100% complete
Backend: Requires Firebase Functions integration

Bottom Line ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                         β”‚
β”‚  "How can we be sure everything is encrypted so even   β”‚
β”‚   if someone asked us to hand over information we      β”‚
β”‚   literally could not?"                                β”‚
β”‚                                                         β”‚
β”‚  ANSWER:                                               β”‚
β”‚                                                         β”‚
β”‚  βœ… User passphrases encrypt data CLIENT-SIDE          β”‚
β”‚  βœ… Passphrases NEVER leave user's device              β”‚
β”‚  βœ… Backend stores only CIPHERTEXT + PUBLIC SALT       β”‚
β”‚  βœ… We CANNOT decrypt without user's passphrase        β”‚
β”‚  βœ… This is CRYPTOGRAPHICALLY PROVABLE                 β”‚
β”‚  βœ… This is LEGALLY DEFENSIBLE                         β”‚
β”‚                                                         β”‚
β”‚  We built it. It's real. It works. πŸ”’                  β”‚
β”‚                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

See full documentation: docs/engineering/ZERO_KNOWLEDGE_ENCRYPTION.md

Built with VitePress