Un conteneur et un compresseur, ce n'est pas la même chose
Deux tâches distinctes se confondent sous le mot « archive ». Regrouper, c'est mettre de nombreux fichiers dans un seul, en conservant leurs noms et leurs dossiers. Compresser, c'est réduire le nombre d'octets. Le TAR ne fait que regrouper : un .tar pèse la somme de tout ce qu'il contient. Gzip ne fait que compresser, et un seul flux à la fois, d'où l'existence du .tar.gz : on regroupe d'abord, puis on comprime le lot. Le ZIP fait les deux en même temps, fichier par fichier, et tient un catalogue de son contenu.
Cette différence détermine le comportement du format. Comme un ZIP enregistre un catalogue à la fin et compresse chaque fichier séparément, il peut lister une archive de dix gigaoctets instantanément et extraire un fichier situé au milieu sans toucher au reste — c'est exactement ce que fait notre lecteur ZIP, qui ne décompresse rien tant que vous ne demandez rien. Une archive solide compresse tout en un seul flux continu : les répétitions d'un fichier à l'autre sont repérées et le résultat est plus petit, parfois beaucoup plus pour de nombreux petits fichiers similaires comme du code source ou des journaux. La contrepartie, c'est qu'il n'existe aucun moyen économique d'atteindre un fichier situé au milieu : tout ce qui le précède doit d'abord être décompressé. Le TAR.GZ est solide par nature, le 7z compresse par blocs solides, et un RAR est lu ici depuis le début plutôt qu'à partir d'un catalogue.
Un contenu déjà compressé ne se compresse pas une deuxième fois. JPEG, PNG, MP3, MP4, PDF et tous les fichiers Office modernes intègrent leur propre compression, et l'algorithme deflate perd du temps sur eux pour n'obtenir aucun gain — en ajoutant parfois quelques octets au passage. Voilà pourquoi le ZIP d'un dossier de photos fait la même taille que le dossier, et pourquoi on croit l'outil en panne. Créer un fichier ZIP reconnaît ces formats et les enregistre tels quels au lieu de faire semblant ; c'est pour cela qu'il termine immédiatement sur des photos et prend son temps sur du texte.
Les métadonnées d'une archive ne sont pas celles de votre disque. Un ZIP enregistre les dates de modification au format MS-DOS, d'une précision de deux secondes, qui ne peut représenter aucune date antérieure à 1980 ni postérieure à 2099 — les dates hors de cette plage sont ramenées dans ses limites ici plutôt que de faire échouer toute l'archive, un vrai bug que nous avons rencontré en convertissant des RAR portant une date nulle. Un TAR enregistre les permissions Unix, les propriétaires et les liens symboliques. Un navigateur ne peut lire aucune de ces informations sur votre disque ni les y réécrire : Créer une archive TAR écrit donc des droits par défaut raisonnables, et nos outils d'ouverture affichent les permissions et les liens sans les restaurer. Si une archive est une sauvegarde qui doit revenir exactement comme elle est partie, elle doit être créée et restaurée avec tar sur la machine elle-même.
Le chiffrement ZIP existe en deux versions, et une seule vaut quelque chose. L'ancien système ZipCrypto est cassé au point d'être décoratif — une attaque à texte clair connu récupère le contenu en quelques secondes sur un matériel ordinaire, et la plupart des logiciels le proposent encore par défaut. L'AES-256, ajouté plus tard, est un vrai chiffrement, impossible à casser. Aucun des deux n'est proposé ici : nous refusons de livrer celui qui est cassé, et le moderne n'a aucune implémentation native dans le navigateur que nous puissions utiliser sous une licence permissive. Bon à savoir dans tous les cas : un ZIP ne chiffre jamais les noms de fichiers, donc le catalogue d'une archive chiffrée est lisible par n'importe qui. « Factures/2024/Accord-confidentiel.pdf » est visible sans le mot de passe.
Une archive est le seul type de fichier dont le contenu peut attaquer le programme qui l'ouvre. Un fichier à l'intérieur peut s'appeler « ../../.bashrc » pour s'échapper du dossier où il est extrait, et quelques kilo-octets peuvent être conçus pour se décompresser en téraoctets et faire planter l'onglet. Les deux cas sont traités avant que vous ne voyiez quoi que ce soit : les noms hostiles — remontées vers le dossier parent, chemins absolus, lettres de lecteur Windows, noms de périphériques réservés, caractères invisibles servant à déguiser une extension — sont neutralisés et chaque correction est listée, et les taux d'expansion sont mesurés puis refusés au lieu d'être tentés. Les liens symboliques contenus dans une archive sont affichés, mais jamais suivis.