Modello di sicurezza
Questa pagina descrive cosa protegge Rempar, come, e cosa non protegge. Il documento di riferimento è il protocollo v1, le cui stringhe sono congelate.
Obiettivo
Una compromissione completa del server, dei suoi backup e del suo amministratore non deve rivelare alcun segreto: né la password principale, né il contenuto, né il nome di un elemento.
Derivazione delle chiavi (solo sul dispositivo)
password = NFKC(saisie)
master_key = Argon2id(password, kdf_salt, m=65536 KiB, t=3, p=4, 32 octets)
auth_key = HKDF-SHA256(master_key, info="rempart/auth/v1")
wrap_key = HKDF-SHA256(master_key, info="rempart/wrap/v1")
kdf_salt: 16 byte casuali, creati con l'account o con la cassaforte locale.auth_keyviene inviata al server come password di account. Non permette di derivare nient'altro.wrap_keynon lascia mai il dispositivo. Sigilla la chiave della cassaforte.- I client rifiutano parametri Argon2id più deboli di m=19456, t=2, p=1, anche se il server li propone.
Formato di sigillatura
seal(key, plaintext, aad) = base64( 0x01 || nonce(24) || XChaCha20-Poly1305(key, nonce, plaintext, aad) )
Ogni utilizzo ha la propria stringa AAD congelata: rempart/vaultkey/v1, rempart/itemkey/v1|<item_id>, rempart/item/v1|<item_id>, rempart/export/v1, ecc. Un blob non può essere riutilizzato in un altro contesto né associato a un altro elemento.
Cassaforte ed elementi
vault_key: 32 byte casuali, creati una volta per cassaforte.- Ogni elemento ha la propria
item_keydi 32 byte. Il blob memorizzato è{ k: seal(vault_key, item_key), c: seal(item_key, contenu) }. - L'elenco viene mostrato da un indice sigillato locale. Aprire una scheda decifra solo quella scheda.
- Gli identificativi degli elementi sono UUID v4 legati in entrambi gli AAD.
Kit di emergenza
32 byte casuali, mostrati una sola volta in Crockford base32. recovery_wrap = HKDF(recovery_key, "rempart/recovery-wrap/v1") sigilla una copia della chiave della cassaforte; recovery_auth = HKDF(recovery_key, "rempart/recovery-auth/v1") autentica un ripristino presso il server.
Account e token
- Pre-login anti-enumerazione: un sale fittizio deterministico viene restituito per le e-mail sconosciute.
- Token di accesso per dispositivo (60 min) e token di aggiornamento a rotazione (30 giorni). Un secondo utilizzo di un token già aggiornato revoca il dispositivo (
token_reused). - 2FA TOTP opzionale, raccomandata. Obbligatoria per gli amministratori.
- Tutte le route sensibili sono limitate in frequenza.
Lato dispositivo
- Segreti mascherati da 12 punti fissi, mascherati di nuovo dopo 30 s.
- Appunti svuotati dopo 30 s (regolabile da 10 s a 2 min). Le frasi di recupero non si copiano mai per intero.
- Blocco dopo 5 min, in sospensione e alla chiusura; la chiave della cassaforte viene azzerata in memoria.
- Ritardi progressivi dopo un errore: 30 s, 1 min, 5 min. Mai una cancellazione silenziosa.
- Android:
FLAG_SECUREimpedisce le catture dello schermo. iOS e macOS: velo di privacy nel selettore delle applicazioni. - Biometria: la chiave della cassaforte viene affidata al portachiavi di sistema protetto da Touch ID, Face ID o impronta digitale, mai a un file.
Cosa il modello non copre
- Un dispositivo compromesso mentre la cassaforte è aperta (spyware, keylogger).
- Una password principale debole: Argon2id rallenta l'attacco, non lo rende impossibile.
- La perdita simultanea della password principale e del kit di emergenza.
- I metadati dell'account: e-mail, numero di elementi, dimensione dei blob, date e piattaforme dei dispositivi.
Segnalare una vulnerabilità
Scriva a security@rempar.org. Confermiamo la ricezione entro 48 ore e pubblichiamo una correzione prima di qualsiasi divulgazione.
Una domanda senza risposta qui? support@rempar.org