Comment fonctionne le chiffrement
SG/Send utilise le chiffrement symétrique AES-256-GCM, réalisé entièrement dans votre navigateur. Le serveur ne voit jamais vos données en clair, vos noms de fichiers ni vos clés de chiffrement. Cette page explique exactement comment.
Chiffrement symétrique : une clé, deux opérations
SG/Send utilise le chiffrement symétrique — la même clé chiffre et déchiffre le fichier. C'est le modèle de chiffrement le plus simple et le plus rapide, et lorsqu'il est bien mis en oeuvre, le plus sûr pour le transfert de fichiers.
Qu'est-ce que AES-256-GCM ?
AES (Advanced Encryption Standard) est l'algorithme de chiffrement utilisé par les gouvernements, les banques et les armées du monde entier. 256 est la taille de la clé en bits — il y a 2256 clés possibles, rendant la force brute informatiquement impossible. GCM (Galois/Counter Mode) ajoute le chiffrement authentifié — il ne se contente pas de chiffrer, il détecte également si quelqu'un a altéré le texte chiffré.
Pourquoi le chiffrement symétrique ?
Le chiffrement symétrique utilise une seule clé pour le chiffrement et le déchiffrement. Cela diffère du chiffrement asymétrique (comme RSA) qui utilise une paire de clés. Pour le transfert de fichiers, le symétrique est le bon choix : c'est rapide, bien compris, et la Web Crypto API fournit une implémentation éprouvée dans chaque navigateur moderne.
Le flux de chiffrement : étape par étape
Voici exactement ce qui se passe quand vous envoyez un fichier via SG/Send.
Génération de clé
Quand vous sélectionnez un fichier, votre navigateur génère une clé AES aléatoire de 256 bits via la Web Crypto API (crypto.subtle.generateKey). Cela utilise le générateur de nombres aléatoires cryptographiquement sûr du système d'exploitation. La clé n'existe que dans la mémoire de votre navigateur.
Génération de l'IV
Un vecteur d'initialisation (IV) de 12 octets est généré aléatoirement (crypto.getRandomValues). L'IV garantit que le chiffrement du même fichier deux fois produit un texte chiffré différent. L'IV n'est pas secret — il est préfixé à la sortie chiffrée et envoyé avec le texte chiffré.
Chiffrement
Le fichier est chiffré dans le navigateur avec crypto.subtle.encrypt en utilisant l'algorithme AES-GCM, la clé générée et l'IV. La sortie est un texte chiffré + un tag d'authentification de 128 bits. Le tag d'authentification est la garantie d'intégrité du GCM — si quelqu'un modifie ne serait-ce qu'un bit du texte chiffré, le déchiffrement échouera.
Téléversement
Seule la sortie chiffrée (IV + texte chiffré + tag d'authentification) est téléversée vers le serveur. Le serveur reçoit un blob d'octets d'apparence aléatoire. Il attribue un identifiant de transfert (12 caractères aléatoires) et stocke le texte chiffré. Pas de nom de fichier, pas d'indication de type de contenu, pas de clé — uniquement des octets chiffrés.
Partage du lien
L'expéditeur obtient un lien de téléchargement. La clé de déchiffrement est placée dans le fragment d'URL (la partie après #). Les fragments d'URL ne sont jamais envoyés au serveur par le navigateur — cela est défini dans la RFC 3986. L'expéditeur partage ce lien par le canal de son choix (email, chat, en personne).
Déchiffrement
Le destinataire ouvre le lien. Son navigateur télécharge les octets chiffrés depuis le serveur, extrait la clé du fragment d'URL, sépare l'IV du texte chiffré et déchiffre avec crypto.subtle.decrypt. Si le tag d'authentification ne correspond pas (falsification détectée), le déchiffrement échoue. Le serveur ne participe jamais au déchiffrement.
Ce que le serveur voit vs. ce qu'il ne voit pas
C'est la garantie de connaissance nulle. Voici exactement quelles données existent sur le serveur.
Le serveur stocke
Identifiant de transfert — 12 caractères aléatoires
Octets chiffrés — indiscernables de données aléatoires
Hash IP — SHA-256 de l'IP + sel rotatif quotidien
Horodatage — date de création du transfert
Taille du fichier — taille du blob chiffré (octets)
Le serveur ne voit jamais
Clé de chiffrement — reste dans le navigateur, partagée via le fragment d'URL
Nom de fichier — jamais envoyé au serveur
Type de fichier — aucune métadonnée content-type stockée
Contenu en clair — seul le texte chiffré est téléversé
Adresse IP brute — hachée avant stockage
Pile technologique
Chaque couche est choisie pour la simplicité, la sécurité et un déploiement sans dépendances.
| Couche | Technologie | Objectif |
|---|---|---|
| Runtime | Python 3.12 / arm64 | Langage du serveur d'application |
| Framework web | FastAPI via osbot-fast-api | Routage HTTP et traitement des requêtes |
| Calcul | AWS Lambda + Mangum | Exécution serverless, paiement à l'usage |
| Stockage | Memory-FS (Storage_FS) | Backend enfichable : mémoire, disque ou S3 |
| Chiffrement | Web Crypto API (AES-256-GCM) | Chiffrement côté client dans le navigateur |
| Système de types | Type_Safe (osbot-utils) | Définitions de schémas sans Pydantic |
| Frontend | Vanilla JS + Web Components | Zéro dépendance de framework (IFD) |
| Tests | pytest, pile en mémoire | Pas de mocks, pas de patches, des implémentations réelles |
| CI/CD | GitHub Actions | Pipeline de test, tag et déploiement |
Architecture du système
Deux fonctions Lambda, une couche de stockage, un CDN. Simple par conception.
Lambda Utilisateur (Publique)
Fonction publique qui gère les transferts de fichiers, les contrôles de santé, les téléversements présignés, les coffres-forts personnels et l'intégration MCP. Accessible via Lambda Function URL derrière CloudFront.
18 points de terminaisonLambda Admin (Authentifiée)
Fonction réservée à l'administration pour la gestion des jetons, l'analytique, les statistiques serveur et les outils MCP admin. Nécessite une authentification. Lambda séparée = frontière de sécurité séparée.
55 points de terminaisonMemory-FS (Storage_FS)
Tout le stockage passe par une couche d'abstraction. Le code applicatif ne sait jamais si le backend est en mémoire, sur disque ou sur S3. Même base de code sur les 7 cibles de déploiement.
Backend enfichableCloudFront CDN
Ressources statiques, mise en cache, terminaison SSL et WAF. Les Lambda URLs fournissent les points de terminaison HTTPS directement — sans API Gateway.
Réseau périphériqueCibles de déploiement
Une base de code, sept cibles de déploiement regroupées en quatre modèles.
Lambda
Déploiement principal. Deux fonctions Lambda derrière des Lambda Function URLs. Points de terminaison HTTPS directs, sans API Gateway.
ProductionConteneur
Docker, AWS Fargate et GCP Cloud Run. La même application conditionnée en conteneur.
Docker / Fargate / GCPServeur
Instances EC2 et builds AMI. Pour les équipes qui ont besoin d'un contrôle total de l'environnement d'exécution.
EC2 / AMICLI
Interface en ligne de commande pour les transferts scriptés, les pipelines CI/CD et les utilisateurs avancés.
Terminal