Chat chiffré

Choisissez comment les messages sont conservés, puis partagez le lien.

Étape 1 sur 3

Conservation des messages

Comment ça marche

Pour commencer

Choisissez comment les messages sont conservés, donnez un nom au salon, définissez un mot de passe difficile à deviner d'au moins 16 caractères et partagez le lien avec les personnes à qui vous voulez parler. Les salons se créent uniquement ici, afin que chacun ait un mot de passe solide et un mode de messages choisi explicitement ; ouvrir l'adresse d'un salon qui n'existe pas ramène à ce formulaire. Le lien ne contient pas la clé : chacun doit saisir le mot de passe, à transmettre par un autre moyen, par exemple en personne ou via une autre application. Un salon enregistré n'a pas de mot de passe : il reçoit une adresse aléatoire et une clé aléatoire de 256 bits après le # de son lien, ce lien est donc la clé et doit être partagé avec le même soin.

Messages

Chaque message est chiffré dans votre navigateur en AES-256-GCM. À l’entrée dans le salon, le mot de passe est traité une seule fois par Argon2id, avec 64 Mio de mémoire et 3 passes, si bien que chaque tentative pour le deviner hors ligne est lente et gourmande en mémoire. HKDF-SHA256 en dérive ensuite la clé des messages, qui dépend aussi du mode de messages du salon, et une seconde valeur, distincte, qui sert uniquement à prouver au serveur que vous faites partie du salon. Le serveur connaît cette valeur, jamais la clé de chiffrement, et le salon porte côté serveur le nom d’une empreinte de cette valeur plutôt que celui de votre salon. Un salon enregistré saute le hachage lent du mot de passe : sa clé est déjà aléatoire, HKDF-SHA256 en dérive donc directement la clé des messages et la valeur d’accès. Dans les salons sans historique sur le serveur, chaque message reçoit en plus une seconde couche avec confidentialité persistante (forward secrecy), décrite plus bas.

Ce que le serveur voit et conserve

Les salons fonctionnent sur Cloudflare Workers. Le relais transmet les messages chiffrés aux personnes présentes dans le salon et ne les stocke pas, sauf dans les salons enregistrés, où il conserve les messages chiffrés, au plus 1000 par salon, dans l’Union européenne jusqu’à ce qu’un membre supprime le salon ou que personne ne l’ait visité pendant 90 jours. Sinon il ne conserve que les paramètres du salon et les supprime lorsque le salon est resté vide pendant 7 jours. Il voit en revanche quand les messages sont envoyés, combien de personnes sont connectées et, d’après le rythme, probablement quand quelqu’un est en train d’écrire. Chaque message est complété jusqu’à l’une d’un nombre limité de tailles, d’au moins 512 octets : les messages courts, les indicateurs de saisie et les signaux de présence se ressemblent tous, et les plus longs ne révèlent que leur taille approximative. Cloudflare, comme tout hébergeur, voit votre adresse IP, et le nom du salon figure dans l’adresse de la page que vous chargez. Dans les salons enregistrés, il conserve aussi les clés publiques ML-DSA des membres, chiffrées avec la clé du salon, si bien qu’il ne peut pas reconnaître à sa clé un membre qui revient.

Historique et messages éphémères

Dans le mode par défaut, chaque participant conserve l’historique dans son propre navigateur : les messages signés, scellés sous une clé dérivée du secret du salon, si bien qu’ils survivent à un rechargement. Les membres en ligne transmettent à un nouveau venu jusqu’aux 200 derniers messages, chiffrés pour lui seul et portant toujours la signature de chaque auteur, si bien que personne ne peut attribuer à quelqu’un des propos qu’il n’a pas tenus en transmettant l’historique. La confidentialité persistante protège ce qui passe par le relais ; ce que les navigateurs des membres conservent, ils peuvent le montrer à quiconque rejoint avec le mot de passe, et c’est précisément le rôle de ce mode. Dans un salon enregistré, l’historique chiffré vit plutôt sur le serveur : il est là après un rechargement, sur un nouvel appareil ou pour qui rejoint plus tard ; votre navigateur en garde aussi une copie et ne demande au serveur que ce qui lui manque. Vous pouvez aussi faire disparaître tous les messages entre 5 secondes et un jour après leur affichage ; rien n’est alors conservé. Dans n’importe quel salon, terminez un message par !N, par exemple !30, pour qu’il disparaisse après N secondes sans être conservé dans l’historique. Le minuteur tourne dans le navigateur de chaque participant : un client modifié ou une simple capture d’écran peut donc tout de même en garder une copie.

Appels

Les appels audio et vidéo utilisent WebRTC. En plus de son chiffrement standard DTLS-SRTP, votre navigateur chiffre chaque trame audio et vidéo, partage d’écran compris, avec AES-256-GCM avant son envoi, sur le modèle de SFrame. Chaque participant crée une clé média aléatoire en rejoignant l’appel et la remet séparément à chacun des autres : dans le canal chiffré du salon, scellée une seconde fois avec une clé que seuls ces deux navigateurs partagent pour cet appel (ECDH P-256). Quand quelqu’un part, tous ceux qui restent passent à une nouvelle clé, si bien que la personne partie ne peut pas déchiffrer la suite. Les trames qui ne se déchiffrent pas sont écartées, jamais lues, et un navigateur incapable de chiffrer les trames ne peut pas rejoindre d’appel. L’établissement de l’appel passe par le salon sous forme de messages chiffrés. Les flux transitent toujours par un relais TURN, si bien que les participants ne voient jamais l’adresse IP des autres ; le relais ne transmet que des paquets chiffrés. Chaque participant se connecte à tous les autres, c’est pourquoi les appels fonctionnent mieux en petit groupe.

Fichiers

Les fichiers jusqu’à 90 Mo sont chiffrés dans votre navigateur avec une clé aléatoire qui leur est propre, nom du fichier compris. La clé et le lien de téléchargement ne voyagent qu’à l’intérieur du message chiffré : un fichier est donc protégé exactement comme le message qui le porte, confidentialité persistante comprise. Le fichier chiffré est envoyé vers le stockage propre d’encrypt.click ou, en cas d’échec, vers des hébergeurs de secours via le serveur d’encrypt.click (fichiers jusqu’à 50 Mo uniquement). Les hébergeurs ne voient que le fichier chiffré, sa taille et l’adresse d’envoi. Les fichiers envoyés sont supprimés 24 heures après l'envoi ; le message reste dans l'historique, pas le téléchargement.

Bon à savoir

Le chat n’est pas plus privé que le lien ou le mot de passe : quiconque l’a peut rejoindre et lire la conversation à partir de ce moment. Dans les salons avec confidentialité persistante, un mot de passe obtenu plus tard n’ouvre en revanche pas le trafic enregistré auparavant, même si, dans le mode par défaut, les membres en ligne transmettent l’historique récent à quiconque rejoint. Un mauvais mot de passe mène à un salon qui n’existe pas : si la page indique que le salon n’existe pas alors que vous attendiez d’autres personnes, vérifiez le mot de passe. Jusqu’à 32 personnes peuvent rejoindre un salon.

Clés des membres dans les salons enregistrés

Dans chaque salon, votre navigateur crée une clé de signature pour ce salon et la garde pour lui ; chaque message porte la moitié publique et une signature, et tout ce qui n'est pas signé est rejeté, y compris l'historique transmis par les autres membres. Les noms ne sont que des étiquettes : l'alias aléatoire ou ce qu'un membre a saisi. Les autres membres retiennent avec quelle clé un nom est apparu la première fois et vous avertissent quand le même nom, ou un nom qui lui ressemble, apparaît sous une nouvelle clé, ce qui est exactement l'allure d'un imposteur connaissant le mot de passe ou le lien. Le panneau des membres affiche pour chacun un code de clé, une courte empreinte de cette seule clé, et un numéro de sécurité dérivé de vos deux clés, identique sur les deux écrans : comparez-le en personne ou de vive voix. Dans un salon enregistré, la clé d'un membre est la paire formée de sa clé Ed25519 et de sa clé ML-DSA-44, et le code de clé comme le numéro de sécurité couvrent les deux. Un nouveau navigateur ou appareil reçoit une nouvelle clé, attendez-vous donc à cet avertissement après un changement. La signature prouve qui a écrit un message dans le salon, pas qui est cette personne, et seuls le mot de passe ou le lien permettent d'entrer. Le mode des messages fait partie de la clé du salon, le serveur ne peut donc pas transformer discrètement un salon à messages éphémères en salon qui garde l'historique. Dans un salon enregistré, quiconque a vu le lien peut tout lire tant que le salon existe ; partagez-le donc avec soin et supprimez le salon quand il a rempli son rôle ; la suppression efface l'historique du serveur et des navigateurs de toutes les personnes connectées.

Confidentialité persistante

Dans les salons qui ne gardent l’historique que dans les navigateurs et dans les salons à messages éphémères, la clé du salon seule n’ouvre aucun message. Chaque navigateur crée en entrant une nouvelle paire de clés P-256 et ne la garde qu’en mémoire. Chaque membre a sa propre chaîne d’envoi : chaque message est chiffré en AES-256-GCM sous une clé que HKDF-SHA256 dérive de la chaîne, puis la chaîne avance d’un pas et les clés utilisées sont effacées. Chacun des autres membres reçoit séparément la clé actuelle de la chaîne, scellée sous une clé issue de leurs deux clés éphémères (ECDH) et d’un secret dérivé du mot de passe du salon, et comme toujours à l’intérieur du canal signé du salon. Qui enregistre le trafic et apprend le mot de passe plus tard ne peut pas lire les messages sans casser l’échange de clés, et une fois la session terminée, les clés nécessaires ne sont plus sur aucun appareil. Un futur ordinateur quantique capable de casser P-256 aurait toujours besoin du mot de passe ; face à quelqu’un qui a le mot de passe et un tel ordinateur, la confidentialité persistante ne tient pas. Les chaînes sont remplacées tous les 100 messages ou toutes les 10 minutes, et chaque fois que quelqu’un part : la nouvelle chaîne ne va qu’aux membres qui répondent, si bien que la personne partie ne peut plus suivre avec ses clés. Un nouveau venu reçoit chaque chaîne à son pas actuel : rien de ce qui est passé par le relais avant son arrivée ne s’ouvre avec ses clés. Les salons enregistrés n’ont pas de confidentialité persistante : leur historique doit rester lisible sur tout appareil qui a le lien.

Salons enregistrés : historique complet et signatures post-quantiques

À la place, les salons enregistrés vérifient que leur historique est complet. Chaque message enregistré porte le numéro d’ordre de son auteur et l’empreinte du message enregistré précédent de cet auteur, l’un et l’autre sous les signatures. Votre navigateur suit la chaîne de chaque auteur à l’arrivée de l’historique et retient où il en est, et les membres en ligne annoncent leur dernier numéro et leur empreinte. Si le serveur omet des messages, change l’ordre des messages d’un auteur ou retient les plus récents, ou si deux messages différents revendiquent la même place, le chat affiche un avertissement. Le serveur continue de supprimer les messages les plus anciens dès qu’un salon en contient 1000, et le chat le signale si c’est arrivé pendant votre absence ; il peut aussi retenir les messages les plus récents d’une personne qui n’est pas en ligne, et l’ordre entre auteurs différents n’est pas vérifié. Les salons enregistrés signent en outre chaque message avec ML-DSA-44 (FIPS 204) en plus d’Ed25519, et un message ne compte que si les deux signatures sont valides : pour en falsifier un, il faudrait casser les deux. Chaque navigateur garde sa clé ML-DSA scellée sous une clé dérivée du lien du salon. Les messages la désignent par son empreinte, et le serveur conserve les clés publiques des membres chiffrées avec la clé du salon, afin que les messages des membres hors ligne puissent aussi être vérifiés. Un message sans signature ML-DSA valide est rejeté, y compris lorsque sa clé ML-DSA n’est pas disponible.