Sécurité

Un modèle de confiance qui s’explique peut être audité ; un modèle qui se cache, non. Voici ce que fait SecureChat, et aussi ce qu’il ne fait pas.

En bref

Comment un message est chiffré (enveloppe v1)

Nous utilisons libsodium, une bibliothèque cryptographique auditée et largement utilisée. Voici les éléments de l’enveloppe v1 (sc1) :

Primitives cryptographiques de l’enveloppe v1
ÉlémentConstruction
Identité (votre appareil et l’entreprise)Paire de clés X25519
Clé de la conversation32 octets aléatoires générés par votre téléphone lorsque vous utilisez l’invitation. Si nous la générions, nous la connaîtrions.
Distribution de cette cléElle est scellée séparément (crypto_box_seal) pour votre clé publique et pour celle de l’entreprise. Nous ne conservons que les deux enveloppes scellées.
Chiffrement de chaque messageXChaCha20-Poly1305 avec un nonce aléatoire de 24 octets
Données associéesChaque message est lié à sa conversation, à son expéditeur, à son identifiant et à la version de clé. Un serveur ne peut ni le déplacer vers une autre conversation, ni le dupliquer sous un autre identifiant, ni faire passer l’un de vos messages pour un message de l’entreprise.
RemplissageJusqu’à des multiples de 256 octets, pour masquer la longueur exacte
Signature de la clé de l’entrepriseEd25519, avec la clé de plateforme
Signature de la rotation de cléEd25519, avec la clé de signature propre à l’entreprise (voir plus bas)
EmpreintesBLAKE2b-256 avec séparation de domaine

Pièces jointes chiffrées

Les photos et les documents sont chiffrés sur l’appareil qui les envoie (votre téléphone ou le serveur de l’entreprise), exactement comme le texte :

Ce qui est protégé

Ce qui n’est pas protégé

Clé de plateforme et vérification des entreprises

Avant qu’une entreprise puisse envoyer des invitations, nous vérifions son existence légale, qu’elle contrôle son domaine (enregistrement DNS) et le numéro WhatsApp depuis lequel elle invite. Nous signons ensuite sa clé publique avec notre clé de plateforme Ed25519. L’application vérifie cette signature et affiche le badge Entreprise vérifiée.

Clé publique de la plateforme (Ed25519, base64url) :

qxh_sOak_wQVqZifJjDcoy-TeWIF3NADjqsjta0GPlw

Ce qui est signé est exactement SecureChat|v1|company-key|<companyId>|<keyVersion>|<clé publique>. Le risque est donc concentré sur nous : si quelqu’un volait la clé de plateforme, il pourrait usurper l’identité d’une marque. C’est pourquoi la vérification du lien existe aussi.

L’entreprise génère sa propre paire de clés sur son infrastructure avec notre SDK (npx @securechat/sdk keygen) et ne nous transmet que la clé publique. Le portail ne propose pas de la générer dans le navigateur : si la clé privée transitait par nos serveurs, la promesse ne serait plus vérifiable.

Entreprises non vérifiées et mode test

Pour qu’une entreprise puisse tester son intégration pendant que nous l’examinons, elle peut créer des invitations de test. Sa clé n’est pas signée comme vérifiée : n’importe qui pourrait donc s’inscrire sous le nom « Banque X » et s’en servir pour usurper l’identité d’une marque. C’est pourquoi :

Le chiffrement est le même que dans une conversation normale. Ce qui change, c’est la garantie d’identité : dans une conversation de test, nous n’avons pas vérifié qui est l’entreprise.

L’empreinte dans le lien d’invitation

Lorsque l’entreprise crée l’invitation avec le SDK, elle ajoute au lien un fragment #s=…&fp=…. Le navigateur n’envoie pas le fragment au serveur, nous ne le voyons donc pas, mais le lien transite par WhatsApp, un canal que nous ne contrôlons pas. Lors de l’utilisation de l’invitation :

  1. L’application vérifie que la clé de l’entreprise que nous lui fournissons correspond à l’empreinte fp du lien.
  2. L’application lie sa propre clé au secret s au moyen d’un MAC, et l’entreprise le vérifie.

Si nous substituions l’une des deux clés, l’une des deux extrémités s’en apercevrait. Limites : cela ne couvre que l’utilisation par lien, pas le code court saisi, et les invitations créées manuellement depuis le portail ne contiennent pas ce secret.

Rotation de clé signée par l’entreprise

En plus de sa clé de chiffrement, l’entreprise génère avec le SDK une clé de signature Ed25519 qui reste elle aussi sur son infrastructure ; seule la clé publique nous est transmise. L’application l’épingle lors du premier contact, avec la clé de chiffrement. Lorsque l’entreprise renouvelle sa clé de chiffrement, elle signe le changement avec cette clé de signature : SecureChat|v1|company-key-rotation|<companyId>|<version précédente>|<clé précédente>|<nouvelle version>|<nouvelle clé>. Nous vérifions la signature avant d’accepter la nouvelle clé, et l’application la vérifie à nouveau.

Pourquoi c’est important : avec notre seule signature de plateforme, une rotation légitime et une usurpation de notre part se ressembleraient. Avec la signature de l’entreprise, usurper l’identité d’une entreprise que vous avez déjà épinglée exige sa clé de signature, qui ne passe jamais par nous. La signature de plateforme reste obligatoire dans les deux cas. Pour l’instant, la clé de signature ne change pas : la remplacer est traité comme une rotation non signée.

Pas de forward secrecy en v1

Chaque conversation utilise une clé stable. Si votre clé privée ou celle de l’entreprise venait à fuiter, en même temps que les messages chiffrés stockés, les messages antérieurs de cette conversation pourraient eux aussi être déchiffrés. Des protocoles comme Signal renouvellent les clés à chaque message pour l’éviter ; nous l’avons délibérément laissé hors de la première version du protocole, et c’est prévu dans notre feuille de route.

Métadonnées

Même si nous ne voyons pas le contenu, nous voyons qui échange avec quelle entreprise, quand et à quelle fréquence, la taille approximative de chaque message (arrondie à 256 octets), la taille et la date de chaque pièce jointe, les adresses IP et des informations sur l’appareil. Cela suffit pour en déduire beaucoup, c’est pourquoi nous le déclarons dans la politique de confidentialité.

L’historique est lié à votre appareil : si vous le perdez, vous récupérez chaque conversation avec une nouvelle invitation de l’entreprise, qui scelle à nouveau la clé pour votre nouvel appareil.

Signaler une vulnérabilité

Écrivez-nous à soporte@securechat-app.com avec l’objet « Sécurité ». Merci de nous laisser un délai raisonnable pour la corriger avant de la rendre publique.