Sicurezza

Un modello di fiducia che si spiega si può verificare; uno che si nasconde, no. Ecco cosa fa SecureChat, e anche cosa non fa.

In breve

Come viene cifrato un messaggio (busta v1)

Usiamo libsodium, una libreria crittografica verificata e ampiamente diffusa. Questi sono i componenti della busta v1 (sc1):

Primitive crittografiche della busta v1
ComponenteCostruzione
Identità (il tuo dispositivo e l’azienda)Coppia di chiavi X25519
Chiave della conversazione32 byte casuali generati dal tuo telefono quando usi l’invito. Se la generassimo noi, la conosceremmo.
Distribuzione di quella chiaveViene sigillata separatamente (crypto_box_seal) per la tua chiave pubblica e per quella dell’azienda. Noi conserviamo solo le due buste sigillate.
Cifratura di ogni messaggioXChaCha20-Poly1305 con nonce casuale di 24 byte
Dati associatiOgni messaggio resta legato alla sua conversazione, al mittente, al suo identificativo e alla versione della chiave. Un server non può spostarlo in un’altra conversazione, duplicarlo con un altro identificativo né far passare un tuo messaggio per uno dell’azienda.
RiempimentoFino a multipli di 256 byte, per nascondere la lunghezza esatta
Firma della chiave dell’aziendaEd25519, con la chiave di piattaforma
Firma della rotazione della chiaveEd25519, con la chiave di firma dell’azienda stessa (più sotto)
ImpronteBLAKE2b-256 con separazione di dominio

Allegati cifrati

Foto e documenti vengono cifrati sul dispositivo che li invia (il tuo telefono o il server dell’azienda), proprio come il testo:

Cosa protegge

Cosa non protegge

Chiave di piattaforma e verifica delle aziende

Prima che un’azienda possa invitare, verifichiamo la sua esistenza legale, che controlli il suo dominio (record DNS) e il numero WhatsApp da cui invita. Poi firmiamo la sua chiave pubblica con la nostra chiave di piattaforma Ed25519. L’app verifica questa firma e mostra il badge Azienda verificata.

Chiave pubblica di piattaforma (Ed25519, base64url):

qxh_sOak_wQVqZifJjDcoy-TeWIF3NADjqsjta0GPlw

Ciò che viene firmato è esattamente SecureChat|v1|company-key|<companyId>|<keyVersion>|<chiave pubblica>. Questo concentra il rischio su di noi: se qualcuno rubasse la chiave di piattaforma, potrebbe spacciarsi per un marchio. Per questo esiste anche il controllo del link.

L’azienda genera la propria coppia di chiavi sulla sua infrastruttura con il nostro SDK (npx @securechat/sdk keygen) e ci carica solo la chiave pubblica. Il portale non offre di generarla nel browser: se la chiave privata passasse dai nostri server, la promessa non sarebbe più verificabile.

Aziende non verificate e Modalità prova

Perché un’azienda possa provare la sua integrazione mentre la esaminiamo, può creare inviti di prova. La sua chiave non è firmata come verificata, quindi chiunque potrebbe registrarsi come “Banca X” e usarli per spacciarsi per un marchio. Per questo:

La cifratura è la stessa di una conversazione normale. Cambia la garanzia di identità: in una conversazione di prova non abbiamo verificato chi è l’azienda.

L’impronta nel link di invito

Quando l’azienda crea l’invito con l’SDK, aggiunge al link un frammento #s=…&fp=…. Il browser non invia il frammento al server, quindi noi non lo vediamo, ma il link viaggia su WhatsApp, un canale che non controlliamo. Quando usi l’invito:

  1. L’app controlla che la chiave dell’azienda che le forniamo abbia l’impronta fp del link.
  2. L’app lega la propria chiave al segreto s con un MAC, e l’azienda lo verifica.

Se sostituissimo una delle due chiavi, uno dei due capi se ne accorgerebbe. Limiti: copre solo l’uso tramite link, non il codice breve digitato, e gli inviti creati a mano dal portale non contengono quel segreto.

Rotazione della chiave firmata dall’azienda

Oltre alla chiave di cifratura, l’azienda genera con l’SDK una chiave di firma Ed25519 che resta anch’essa sulla sua infrastruttura; ci carica solo quella pubblica. L’app la fissa al primo contatto, insieme a quella di cifratura. Quando l’azienda ruota la sua chiave di cifratura, firma il cambio con quella chiave di firma: SecureChat|v1|company-key-rotation|<companyId>|<versione precedente>|<chiave precedente>|<nuova versione>|<nuova chiave>. Verifichiamo la firma prima di accettare la nuova chiave, e l’app la verifica di nuovo.

Perché conta: con la sola nostra firma di piattaforma, una rotazione legittima e una sostituzione fatta da noi sembrerebbero uguali. Con la firma dell’azienda, spacciarsi per un’azienda che hai già fissato richiede la sua chiave di firma, che non passa mai da noi. La firma di piattaforma resta obbligatoria in entrambi i casi. Per ora la chiave di firma non ruota: cambiarla viene trattato come una rotazione non firmata.

Niente forward secrecy nella v1

Ogni conversazione usa una chiave stabile. Se in futuro la tua chiave privata o quella dell’azienda venisse divulgata, insieme ai messaggi cifrati conservati, si potrebbero decifrare anche i messaggi precedenti di quella conversazione. Protocolli come Signal rinnovano le chiavi a ogni messaggio per evitarlo; l’abbiamo lasciato fuori deliberatamente dalla prima versione del protocollo ed è nella nostra roadmap.

Metadati

Anche se non vediamo il contenuto, vediamo chi parla con quale azienda, quando e con che frequenza, la dimensione approssimativa di ogni messaggio (arrotondata a 256 byte), la dimensione e la data di ogni allegato, gli indirizzi IP e i dati del dispositivo. Bastano per dedurre parecchio, ed è per questo che lo dichiariamo nell’informativa sulla privacy.

La cronologia è legata al tuo dispositivo: se lo perdi, recuperi ogni conversazione con un nuovo invito dell’azienda, che sigilla di nuovo la chiave per il tuo nuovo dispositivo.

Segnalare una vulnerabilità

Scrivici a soporte@securechat-app.com con oggetto “Sicurezza”. Ti chiediamo un tempo ragionevole per correggerla prima di renderla pubblica.