← Retour aux projets Projet Perso · Cryptographie

Ttoile Share — partage chiffré de bout en bout

Partage de secrets et de fichiers chiffré de bout en bout, éphémère et open-source, où le serveur ne voit jamais rien d'autre que du chiffré.

Chiffrement E2E AES-256-GCM Node.js sans framework TOTP
Voir le projet

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.

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.

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.

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

  1. Conception et mise en œuvre d'un schéma de chiffrement de bout en bout (WebCrypto, AES-256-GCM, dérivation HKDF et PBKDF2).
  2. Implémentation cryptographique bas niveau en Node.js : TOTP RFC 6238, base32, comparaison en temps constant.
  3. Durcissement d'une application web : CSP sans JS inline, anti-CSRF, en-têtes de sécurité, rate limiting fail-closed.
  4. Modélisation des menaces et défenses anti-énumération et anti-rejeu, mesurées et commentées dans le code.
  5. Déploiement auto-hébergé sobre : service systemd utilisateur, tunnel Cloudflare, une seule dépendance externe.