
Chat Web discret de bout en bout avec une cryptographie forte
0FC vous permet d'exécuter une conversation de groupe de navigateur sécurisée avec des salles de chat isolées, ayant des fonctionnalités spéciales:
- de bout en bout pour une salle de chat spécifique: le serveur ne peut pas faire mieux que DOS Attack
- Le serveur est considéré comme une zone de confiance minimale, toutes les opérations importantes se produisent du côté client:
- Les clés éphémères utilisées pour protéger le trafic de la salle de chat sont générées dans le navigateur du propriétaire de la pièce et propagées au reste
- Les jetons secrets, utilisés pour donner accès à Chatroom, sont générés du côté client (bien qu'une partie de la vérification se produise côté serveur)
- Pendant le partage des clés, chaque message de service est protégé par des clés, dérivé de données aléatoires de plus d'une partie
- Les messages sortants sont cryptés et envoyés une seule fois (tous les membres de la salle partagent la même clé symétrique)
- Le jeton d'accès secret est utilisé une fois (supprimé après confirmation de clé)
0FC a été lancé comme test de terrain de jeu pour des cas d'utilisation sophistiqués de themis / webthemis, mais est devenu suffisamment intéressant pour le publier comme un blob de code distinct.
Important: Pour être considéré comme vraiment sécurisé, le 0FC doit être validé par des tiers et déployé correctement. Aucun outil cryptographique ne doit être fiable sans audit tiers. Avant que cela ne se produise (si jamais), il y a une description du protocole à la fin de ce document, qui vous permet de jeter un œil au fonctionnement interne de 0FC et de porter votre propre jugement. Nous sommes nous-mêmes conscients de quelques menaces rarement possibles sans rapport avec la cryptographie, mais plutôt le fonctionnement du navigateur (voir la section du modèle de menace de l'article de blog).
Le backend 0FC est écrit en Python, le front-end est basé sur la webhéme, il fonctionne donc uniquement dans les navigateurs basés sur Google Chrome.
0FC est concédé sous licence Apache 2. Nous serions heureux si vous construisiez quelque chose en fonction de ce code et du protocole de 0FC; Si vous souhaitez de l'aide pour cela, contactez-nous.
Lisez le billet de blog pour en savoir plus sur les technologies 0FC et sous-jacentes.
Installation et utilisation
0FC se compose de deux composants: un serveur et un client.
Serveur 0fc
Le serveur 0FC nécessite:
- Python 3.4
- pépin
- Themis (construction et installation)
Tout d'abord, vous devrez installer des dépendances Python:
pip install -r requirements.txt
Cela fait, vous pouvez exécuter le serveur:
Par défaut, le serveur écoutera le port 5103. Pour modifier le port Add -p <port> :
python3 server.py -port 333
Client 0FC
Le client 0FC est déjà compilé dans / statique / dossier. Gardez à l'esprit qu'il a des touches de serveur codées en dur; Si vous régénérez les clés, vous devrez reconstruire le client (voir ci-dessous).
Utilisation de 0fc
... est assez explicite. Vous pouvez créer une nouvelle pièce, générer des jetons et inviter des gens à rejoindre, ou entrer des jetons existants pour entrer dans la pièce.
Reconstruire le client 0FC
Si vous souhaitez recompiler vous-même le client 0FC (objet PNACL), voici ce que vous devez faire:
- Pour créer un objet PNACL, vous devez installer NACL SDK et créer une variable Enviromant
PNACL_ROOT avec le chemin d'accès aux fichiers SDK installés. - Référentiel de clone 0fc avec sous-modules de GitHub:
git clone https://github.com/cossacklabs/0fc
cd 0fc
git submodules update --init --recursive
- Créer des webthemis:
- Créer le module PNACL 0FC:
Vous avez terminé!
Architecture

0FC se compose de 2 composants classiques: client et serveur.
Les clients sont responsables de:
- Affichage de l'interface utilisateur
- Toutes les fonctions de gestion cryptographique et de confiance
- Communication avec le serveur de relais
Le serveur est responsable de:
- Servir UI + PEXE (module PNACL) aux clients via HTTP Get
- L'exécution du service de relais WebSocket, qui reçoit des messages et les relaie à tout le monde.
Sur le lien WebSocket, les clients parlent à Server via l'objet SecureSession Thémis, qui assure la sécurité des transports de haut niveau. Les clés du serveur sont codées en dur en clients, de sorte que la confiance est établie en fonction de la corrélation entre la clé du serveur réel et la clé de serveur alimentée au client en binaires.
Dans ce lien de sécurisation, des messages encastrés SecureCell sont transmis.
Protocole et schéma

Création de chambre
- Le propriétaire de la chambre génère une paire de clés
[client] - Le propriétaire de la chambre génère une clé de chambre (qui sera utilisée pour crypter les messages dans la salle)
[client] - Le propriétaire de la salle demande au serveur de créer la pièce, recevant l'ID de la salle en réponse
[client] + [server]
Inviter les autres (partage de clés)
- Le propriétaire de la chambre génère un jeton invite aléatoire
[client] - Le propriétaire de la salle envoie une invitation par une chaîne hors bande (comme le courrier électronique), qui comprend un jeton Invite, sa clé publique et son identifiant de chambre
[client] - L'utilisateur reçoit le jeton d'invitation
[client] - L'utilisateur génère une paire de clés
[client] - L'utilisateur génère une clé de jointure aléatoire
[client] - L'utilisateur envoie un message sécurisé au propriétaire de la salle via un serveur avec une clé de jointure cryptée
[client] - Le serveur peut vérifier sur ACL si cette invitation est valide et transmettre le message au propriétaire de la salle
[server] - Le propriétaire de la chambre débouche à la clé
[client] - Le propriétaire de la salle envoie une clé de salle scellée à l'utilisateur via le serveur à l'aide de la clé de jointure comme clé maître et invitez le jeton en tant que contexte
[client] - Le serveur peut vérifier sur ACL si cette réponse est valide et transmettre le message à l'utilisateur
[server] - L'utilisateur dénoue la clé de la pièce
[client] - L'utilisateur envoie un message de confirmation scellé au propriétaire de la salle.
[client] - Propriétaire, en vérifiant les utilisateurs, le message de confirmation signe sa clé publique et envoie au serveur
[client] + [server] - Le serveur vérifie la signature et considère l'utilisateur comme ajouté au chat
[server] - Une fois que le jeton Invite a été utilisé, il est rejeté par le propriétaire de la salle
[server]
Échange de messages
- Les membres de la chambre échangent des messages les scellant avec une clé de la pièce. Le serveur transfère simplement les messages cryptés sans avoir accès à leur contenu.
[server]
Gestion clé
- Le clés est généré pour chaque pièce
[client] - KeyPair est stocké dans le stockage du stockage persistant
[client] - Le stockage persistant du navigateur est crypté avec une cellule sécurisée (mode de phoque), clé dérivée du mot de passe de l'utilisateur, entrées lors de la joie du chat
[client]
Communication du serveur
- Les clients communiquent avec le serveur à l'aide de la session sécurisée THEmis
[server] - La clé publique de confiance du serveur est codée en dur dans les clients
[client] - Le serveur n'effectue pas d'authentification client, fait automatiquement confiance à chaque clé client SS (c'est d'abord une étape évidente pour durcir si la sécurité est plus importante que l'ubiquité et l'anonymat)
[server]
Rotation clé
- Tous les 100 messages (configurables) envoyés et reçus, le propriétaire de la salle génère une nouvelle clé, le crypte avec l'ancienne clé et envoie un message spécial
[client] - Le serveur applique que ces messages ne peuvent provenir que du propriétaire de la salle
[server]
Orchestration de la salle
- Une liste des membres est maintenue pour chaque pièce comme une liste de clés publiques (+ indication qui est propriétaire de salle)
[server] - Chaque chambre a un propriétaire de chambre (à l'origine, créateur de chambre)
[server] - Le propriétaire de la chambre est responsable de la rotation clé
[client]
Historique du chat
- Le serveur permet aux clients de récupérer l'historique du chat depuis leur dernier départ pour les membres qui sont en ligne et connaissent les clés avant la rotation
[server] - Le serveur permet aux clients de récupérer l'historique du chat depuis la dernière rotation des clés pour les nouveaux membres
[server]
Vous voulez en savoir plus?
Lisez notre article de blog avec quelques antécédents sur le développement 0FC et diverses considérations de sécurité.