01
L'objectif
Envoyer un mot de passe ou un fichier sensible par e-mail, c'est le laisser en clair sur plusieurs serveurs, pour une durée indéterminée. Ttoile Share répond à ce problème : un service web auto-hébergé qui produit des liens de partage chiffrés de bout en bout, où le serveur ne voit jamais rien d'autre que du chiffré — ni le contenu, ni même le nom du fichier.
Chaque lien est éphémère : durée de vie de 1 à 30 jours et nombre d'ouvertures limité, avec suppression automatique une fois le seuil atteint. La création de secrets est réservée à des administrateurs authentifiés, et l'ensemble tient dans environ 1 600 lignes de Node.js.
02
Le chiffrement de bout en bout
- Tout le chiffrement s'effectue dans le navigateur (WebCrypto, AES-256-GCM) ; le serveur ne reçoit que des données déjà chiffrées.
- La clé de 32 octets voyage dans le fragment d'URL (#), qui n'est jamais envoyé au serveur : un lien privé de son fragment reste indéchiffrable, y compris par le serveur lui-même.
- Dérivation de clés éprouvée (HKDF et PBKDF2) et preuve de possession exigée avant toute livraison du contenu chiffré.
- Un mauvais mot de passe d'ouverture ne consomme pas de vue, ce qui évite d'épuiser un lien par erreur ou par tentative.
03
L'implémentation
- Serveur HTTP écrit sans framework (node:http, environ 470 lignes) : validation stricte des entrées, limites de taille et écritures atomiques.
- Purge périodique des secrets expirés et orphelins, pour ne rien conserver au-delà du strict nécessaire.
- TOTP (RFC 6238) et base32 implémentés en pur node:crypto, avec anti-rejeu par compteur.
- Une seule dépendance npm au total, dédiée à la génération de QR codes.
04
Le durcissement
- CSP stricte sans aucun JavaScript inline et jeu complet d'en-têtes de sécurité.
- Authentification administrateur à deux facteurs (TOTP) obligatoire, avec anti-rejeu et invalidation de session.
- Protection anti-CSRF en profondeur et contrôle d'origine des requêtes.
- Limitation du débit en mode fail-closed, résistante à la rotation d'adresse, avec comparaisons en temps constant contre l'énumération.
- Serveur en écoute locale exposé via un tunnel, données chiffrées au repos et permissions restreintes.
Compétences développées
- Conception et mise en œuvre d'un schéma de chiffrement de bout en bout (WebCrypto, AES-256-GCM, dérivation HKDF et PBKDF2).
- Implémentation cryptographique bas niveau en Node.js : TOTP RFC 6238, base32, comparaison en temps constant.
- Durcissement d'une application web : CSP sans JS inline, anti-CSRF, en-têtes de sécurité, rate limiting fail-closed.
- Modélisation des menaces et défenses anti-énumération et anti-rejeu, mesurées et commentées dans le code.
- Déploiement auto-hébergé sobre : service systemd utilisateur, tunnel Cloudflare, une seule dépendance externe.