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_key viene inviata al server come password di account. Non permette di derivare nient'altro.
  • wrap_key non 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_key di 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_SECURE impedisce 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