Travaux pratiques · ESILV · 2024
Routage en oignon
Comment faire passer un message par trois inconnus sans qu'aucun ne sache à la fois qui parle et à qui ? En TP, j'ai implémenté en TypeScript un petit réseau de type Tor. Ici, le même protocole tourne dans votre navigateur, avec un vrai chiffrement : chaque clé est générée à l'instant et ne quitte jamais cette page.
Portage web réalisé avec une assistance d'IA, à partir de mon code du TP.
Envoyer un message
L'oignon
Alice chiffre d'abord pour le dernier nœud, puis emballe le tout pour le deuxième, puis pour le premier.
Le trajet
Ce que chacun peut savoir
| Sait qu'Alice écrit | Sait que c'est pour Bob | Lit le message | |
|---|---|---|---|
| Nœud d'entrée | oui | non | non |
| Nœud du milieu | non | non | non |
| Nœud de sortie | non | oui | oui, faute de chiffrement de bout en bout |
| Observateur d'un lien | selon le lien | selon le lien | non |
Aucun nœud ne connaît à la fois l'expéditeur et le destinataire : c'est tout l'intérêt de l'oignon. Il suffit en revanche que l'entrée et la sortie soient tenues par la même personne pour que l'anonymat tombe.
Les limites du TP, et ce que fait Tor
La taille trahit la position
Chaque couche retirée raccourcit le paquet, comme le montre le trajet ci-dessus : un observateur peut deviner à quel saut il se trouve. Tor découpe tout en cellules de taille fixe.
Chiffrer n'est pas authentifier
AES-CBC sans code d'authentification : un nœud malveillant peut modifier des octets sans que le suivant s'en aperçoive. Tor vérifie l'intégrité de chaque cellule.
Des clés trop bavardes
Pour que les tests automatiques puissent tout vérifier, chaque nœud exposait sa clé privée sur une route HTTP. Acceptable dans un TP, jamais en vrai : le code le signalait en commentaire.
Le TP portait sur le routage, pas sur la production : ces choix sont ceux de l'énoncé et de ses tests, gardés ici pour être fidèle au code.
Du TP au navigateur
Le TP
- TypeScript et Express : un registre, des nœuds et des utilisateurs, chacun sur son port
- Énoncé et tests unitaires fournis ; implémentation personnelle
- Primitives WebCrypto de Node : RSA-OAEP 2048 / SHA-256, AES-256-CBC
Le même protocole
- Circuit de 3 nœuds distincts tirés au hasard dans le registre
- Par couche : une clé AES neuve, chiffrée en RSA pour le nœud
- Adresse du saut suivant sur 10 chiffres en tête de chaque couche
Ce que la page ajoute
- Le réseau entier simulé dans une page, sans serveur
- Chaque couche et chaque saut rendus visibles
- Les limites de sécurité expliquées