🛡️ Architettura di Sicurezza TL Wallet
Zero-Knowledge by Design. Verificabile. Open Source.
Principio Fondante: Zero-Knowledge
TL Wallet è costruito su un principio semplice: il server non deve mai vedere le tue chiavi private. Non è una promessa di marketing — è un vincolo architetturale. Il seed BIP39 viene generato, crittografato e archiviato esclusivamente sul dispositivo dell'utente. Il server Firebase funge solo da relay di metadati pubblici (stato del wallet, nonce anti-replay, timestamp) e non ha mai accesso al contenuto cifrato.
Stack Crittografico
| Componente | Algoritmo | Scopo |
|---|---|---|
| Cifratura a riposo (seed) | AES-256-GCM | Protezione del seed sul dispositivo |
| Scambio chiavi (transfer) | X25519 (Curve25519 ECDH) | Accordo su chiave effimera senza scambio di segreti |
| Firma digitale (transfer) | ED25519 (EdDSA) | Autenticazione e anti-manomissione del payload |
| Derivazione chiave (backup cloud) | PBKDF2-HMAC-SHA256 | Derivazione chiave AES da password utente (600k iterazioni) |
| Cifratura (backup cloud) | AES-256-GCM | Cifratura del seed per backup su Firestore |
| Derivazione wallet | BIP39 + BIP84 | Seed phrase → derivazione indirizzi Native SegWit (bech32) |
| Trasporto P2P | DTLS-SRTP (WebRTC) | Cifratura nativa del canale dati WebRTC |
Flusso di Trasferimento Sicuro
1. Bluetooth P2P (Android)
- Discovery: I dispositivi si scoprono via BLE con validazione del fingerprint del certificato
- Key Exchange: Scambio di chiavi pubbliche effimere X25519
- Transfer: Il seed viene cifrato con la chiave condivisa e trasmesso con firma ED25519
- Conferma: Il ricevente decifra e conferma crittograficamente; il server marca il wallet come trasferito
2. QR Code a 2 Fasi (iOS + Android)
- Fase 1: Il ricevente genera un QR code contenente la sua chiave pubblica effimera X25519
- Fase 2: Il mittente scansiona, cifra il seed con quella chiave, e genera un secondo QR code
- Il payload è cifrato X25519 + firmato ED25519. Due scansioni, zero connessioni di rete
3. WebRTC (Sperimentale)
- Signaling via Firestore (scambio SDP offer/answer e candidati ICE)
- DataChannel WebRTC con cifratura nativa DTLS-SRTP
- Il seed è cifrato a livello applicativo prima di essere inviato sul canale
Backup Cloud Cifrato
TL Wallet offre un backup cloud opzionale del seed, protetto da crittografia a conoscenza zero:
- Password utente → PBKDF2-HMAC-SHA256 (600k iterazioni) → chiave AES-256
- Il seed viene cifrato con AES-256-GCM e salvato su Firestore (
wallet_backups/{walletId}) - La password non viene mai inviata al server. Senza la password, il ciphertext è inutile
- Il backup viene automaticamente eliminato in caso di trasferimento del wallet (previene furto post-trasferimento)
- Il restore verifica che il wallet appartenga ancora al dispositivo richiedente (device_id match)
Protezione Anti-Replay
Ogni mutazione del wallet (registrazione, unlock, trasferimento) è protetta da:
- Nonce monotòno: Ogni operazione incrementa un contatore; operazioni con nonce duplicato o inferiore vengono rifiutate
- Timestamp con drift tolerance (±5 minuti): Previene attacchi con payload scaduti
- Firma ED25519: Ogni payload è firmato con la chiave privata del dispositivo, verificata lato server
Threat Model
| Minaccia | Mitigazione | Rischio Residuo |
|---|---|---|
| Hackeraggio server Firebase | Zero-knowledge: i dati sono cifrati lato client, il server non ha chiavi | 🟢 Basso — Metadati pubblici esposti, seed illeggibile |
| Furto dispositivo | Seed cifrato AES-256 + autenticazione biometrica per azioni sensibili | 🟡 Medio — Dipende dalla forza del lockscreen del dispositivo |
| Intercettazione Bluetooth | Cifratura applicativa X25519 + ED25519 sopra il trasporto BLE | 🟢 Basso — Dati cifrati anche se il canale è compromesso |
| Password backup debole | Minimo 8 caratteri richiesti dalla UI + 600k iterazioni PBKDF2 | 🟡 Medio — Con 8 char alfanumerici: ~6900 anni CPU per brute-force |
| Attacco Man-in-the-Middle (QR) | Il QR code è effimero e usa chiavi pubbliche mostrate su entrambi i dispositivi | 🟢 Basso — Richiede accesso fisico a entrambi i dispositivi simultaneamente |
| Furto post-trasferimento via backup | Backup cloud eliminato automaticamente al trasferimento + verifica device_id | 🟢 Basso — Doppia protezione: eliminazione + controllo proprietà |
Verifica Indipendente
TL Wallet è completamente open-source. Chiunque può verificare il codice:
- Backend:
functions/src/— Cloud Functions, validazione firme, anti-replay - App Flutter:
mobile/lib/— Generazione seed, cifratura, trasferimento, UI - Regole Firestore:
firestore.rules— Accesso condizionale ai dati - APK: Firmato e verificabile via SHA256 checksum pubblicato su GitHub