Comment votre navigateur envoie des fichiers chiffrés directement vers le stockage
Quand vous envoyez un transfert hébergé, votre navigateur chiffre chaque fichier et l’envoie directement vers notre stockage d’objets dans l’UE. Le fichier ne passe pas par notre API en chemin. L’API décide si un envoi peut démarrer, signe une adresse de courte durée pour chaque partie et vérifie le résultat avant que le lien devienne actif. C’est votre navigateur qui fait le gros du travail.
Cet article suit ce trajet, du moment où vous déposez un fichier jusqu’au moment où le lien fonctionne.
Pourquoi envoyer directement vers le stockage
La manière habituelle de construire un envoi consiste à transmettre le fichier à un serveur d’application, qui l’écrit ensuite dans le stockage. Chaque octet traverse alors deux réseaux, et le serveur d’application devient le goulot d’étranglement de tous les gros fichiers à la fois.
Transferify saute cette étape. Notre stockage parle le protocole S3, qui permet à un service de distribuer des adresses signées : une adresse web qui autorise une seule action précise, par exemple envoyer une partie donnée d’un fichier donné, jusqu’à son expiration. Votre navigateur envoie chaque partie chiffrée directement à une telle adresse. L’API ne manipule jamais les octets du fichier, seulement les petites requêtes qui préparent l’envoi et le terminent.
Le stockage se trouve dans l’UE. Les nouveaux fichiers vont chez Cloudflare R2, limité à sa juridiction UE. Les fichiers stockés avant ce changement restent sur AWS S3 à Francfort.
Étape 1 : le transfert est enregistré
Avant tout envoi, votre navigateur indique à notre service ce qu’il s’apprête à envoyer : les détails des fichiers et les options que vous avez choisies. Le service vérifie que le transfert respecte votre plan, par exemple la taille d’envoi que votre plan autorise, et crée le transfert.
Étape 2 : les fichiers circulent par groupes
Les fichiers circulent ensuite par groupes de 100 au plus. Pour chaque groupe, une seule requête demande à notre service de démarrer un envoi vers le stockage pour chaque fichier du groupe, et la vérification du plan est refaite. Plus tard, une requête termine le groupe entier.
Le regroupement garde le nombre de requêtes faible. Un transfert de 10 000 fichiers demande environ 300 requêtes à notre service, là où une requête par fichier et par étape en demanderait environ 30 000.
Étape 3 : le fichier est chiffré et découpé en parties
Votre navigateur lit le fichier en flux et le chiffre avec AES-256-GCM par blocs : 8 Mio pour la plupart des fichiers, et un multiple plus grand de 8 Mio pour les très gros. Le stockage accepte au plus 10 000 parties par fichier, et un fichier a exactement autant de parties que de blocs chiffrés : la taille des blocs croît donc avec le fichier pour rester dans cette limite. Le fonctionnement du chiffrement lui-même, et le trajet de la clé, sont expliqués dans comment Transferify chiffre vos fichiers dans votre navigateur.
Les parties sont des tranches de même longueur du flux chiffré, et non les blocs eux-mêmes, car le stockage exige que toutes les parties sauf la dernière aient exactement la même longueur.
Étape 4 : chaque partie reçoit sa propre adresse signée
Pour chaque partie, notre service signe une adresse qui autorise l’envoi de cette seule partie, valable 12 heures. Votre navigateur demande les adresses par lots, un peu avant les parties qui s’en serviront : une adresse est donc utilisée bien avant son expiration. Quand une partie doit être renvoyée, elle reçoit une adresse nouvellement signée.
Étape 5 : de nombreuses parties en cours, dans la limite d’un budget mémoire
Une seule connexion vers le stockage remplit rarement une ligne rapide. Votre navigateur garde donc plusieurs parties en cours d’envoi en même temps : pendant qu’une partie est sur le réseau, la suivante est déjà en cours de chiffrement.
Le nombre de parties en parallèle est décidé sur votre appareil, en deux temps :
- Un budget mémoire. Les parties chiffrées doivent rester en mémoire jusqu’à ce que le stockage les confirme. Le navigateur fixe un budget pour votre type d’appareil, bien plus réduit sur les téléphones, et ne garde jamais plus de parties en cours que ce budget n’en permet.
- Mesuré, pas deviné. Le navigateur part de la largeur que le budget autorise, normalement quatre parties, et essaie d’ajouter des envois parallèles tant que la vitesse mesurée continue de s’améliorer, jusqu’à 16 à la fois. Il ne descend jamais sous sa largeur de départ : la recherche ne peut donc pas rendre un envoi plus lent qu’il ne l’aurait été.
Le fichier n’est lu sur le disque qu’à la vitesse à laquelle les parties partent : un fichier bien plus volumineux que la mémoire de votre appareil s’envoie donc sans difficulté.
Étape 6 : le stockage confirme, notre service vérifie
Quand toutes les parties des fichiers d’un groupe sont dans le stockage, votre navigateur demande à notre service de les terminer. Avant qu’un fichier soit accepté, le service vérifie que :
- le nombre de parties correspond au nombre de blocs chiffrés que le fichier doit avoir,
- la taille stockée correspond, à l’octet près, à celle que doit avoir un fichier chiffré de la taille annoncée.
Si la taille stockée est erronée, la copie stockée est supprimée et le fichier n’est pas accepté. Une fois tous les fichiers du transfert terminés, le lien de partage devient actif.
Quand quelque chose tourne mal
- Une partie échoue. Elle est réessayée avec une adresse nouvellement signée. On attend le retour des connexions perdues, et un envoi interrompu par un rechargement peut être repris plus tard dans le même navigateur. Les détails sont dans comment un gros envoi chiffré survit à une connexion coupée.
- Le stockage refuse de terminer un fichier. Ce fichier est renvoyé, jusqu’à trois fois au total, avant que l’envoi abandonne.
- Vous annulez. Les envois encore ouverts dans le stockage sont annulés et le transfert est abandonné. Tout ce que le stockage conserve d’un envoi inachevé est effacé automatiquement sept jours après le début de cet envoi.
Essayez
Déposez un gros fichier dans Transferify, choisissez un lien hébergé et observez la progression : ce que vous voyez, c’est votre propre navigateur qui chiffre et envoie en parallèle. Envoyez un fichier maintenant.
Questions fréquentes
Mon fichier passe-t-il par l’API de Transferify en route vers le stockage ?
Non. Votre navigateur envoie le fichier chiffré directement vers notre stockage d’objets dans l’UE. Notre API enregistre le transfert, signe une adresse de courte durée pour chaque partie et vérifie le résultat à la fin, mais les octets du fichier ne passent pas par elle.
Pourquoi mon fichier est-il découpé en parties ?
Les parties permettent à un gros fichier de partir par plusieurs connexions à la fois, et de renvoyer une partie qui a échoué sans repartir de zéro pour tout le fichier. Chaque partie est une tranche du fichier déjà chiffré.
Envoyer un gros fichier demande-t-il beaucoup de mémoire ?
Non. Votre navigateur lit et chiffre le fichier morceau par morceau, et ne garde que les parties en cours d’envoi. Le nombre de parties qu’il garde en cours d’envoi est limité par un budget mémoire adapté à votre type d’appareil.
Qu’est-ce qui empêche un envoi cassé ou incomplet de devenir un lien de téléchargement ?
Quand un fichier est terminé, notre service vérifie que le stockage contient exactement le nombre de parties et la taille chiffrée exacte que le fichier doit avoir. Si la taille stockée est erronée, la copie stockée est supprimée et le fichier n’est pas accepté.