Aussi disponible en : English · Español · Português · العربية
Signatures de fichier et nombres magiques
Les nombres magiques de 33 formats, chacun avec le document qui le définit vraiment, et un identificateur qui ne lit que l’en-tête, dans votre navigateur.
Qu’est-ce qu’une signature de fichier ?
Une signature de fichier, ou nombre magique, est une courte suite fixe d’octets au début d’un fichier qui indique de quel type il s’agit. Tous les PNG commencent par les mêmes huit octets ; toutes les archives gzip par les mêmes deux. Les programmes les lisent parce que le nom ne prouve rien : renommer un tableur en .png ne change rien à ce qu’il contient, et un fichier venu d’internet porte le nom que son expéditeur a bien voulu lui donner.
La liste ci-dessous réunit 33 formats avec leurs octets, l’endroit du fichier où ces octets se trouvent, et le type de média lorsqu’il en existe un d’enregistré. Ce qu’elle apporte en plus, et que les tableaux recopiés les uns sur les autres laissent tomber, c’est le document qui définit chaque signature. Cette colonne se révèle être la plus intéressante.
Car la réponse n’a rien d’uniforme. Certaines signatures sont fixées dans le texte normatif d’une norme publiée. D’autres seulement dans la documentation de l’éditeur. D’autres encore dans un document qui ne fait plus autorité. Et quelques-unes — ICO, bzip2, 7-Zip — sont implémentées à l’identique par tous les outils de la terre sans avoir jamais été écrites nulle part comme une exigence.
Comment s’en servir
- Déposez un fichier, ou choisissez-en un. Seul l’en-tête est lu, et c’est votre navigateur qui le lit. Rien n’est envoyé. Si une signature correspond, vous obtenez le format, les octets qui ont correspondu et l’endroit où ils sont définis.
- Ou collez les octets que vous avez déjà. Si vous regardez un vidage hexadécimal, collez les premiers octets. Espaces, préfixes 0x et minuscules sont acceptés ; il faut simplement un nombre pair de chiffres.
- Cherchez dans la liste par n’importe quel élément de la ligne. Le nom du format, une extension, un type de média, un préfixe hexadécimal ou le nom d’une spécification fonctionnent tous. Taper png place PNG en tête au lieu de l’enfouir sous tout ce qui contient ces lettres.
La signature du PNG, et l’explication que la norme a laissée tomber
Le PNG mérite qu’on s’y arrête, parce que ses huit octets sont les mieux conçus de la liste et que leur histoire n’est pas celle qu’on attendrait. Ce sont 137, 80, 78, 71, 13, 10, 26, 10 — en texte, un octet dont le bit de poids fort est mis, puis PNG, puis un retour chariot, un saut de ligne, un control-Z et un dernier saut de ligne.
Chacun fait son travail. Le premier octet n’est délibérément pas un caractère ASCII, pour qu’un fichier texte ne soit guère pris pour un PNG et surtout pour attraper un transfert qui effacerait le bit de poids fort de chaque octet. Le retour chariot et le saut de ligne attrapent le problème inverse : un transfert qui convertit obligeamment les fins de ligne d’une plateforme à l’autre abîme cette paire, et le fichier échoue au cinquième octet plutôt qu’au fin fond de l’image. Le control-Z empêche MS-DOS de déverser la suite d’un binaire dans le terminal quand on en fait un type. Le saut de ligne final attrape l’inverse de la conversion CR-LF.
Et voici ce qui nous a surpris. Cette explication ne figure pas dans la norme actuelle. L’ISO/IEC 15948, qui normalise le PNG aujourd’hui, énonce les huit octets et passe à autre chose, ne gardant qu’une phrase dans sa clause de justification pour dire que la signature détecte les erreurs de transmission courantes. Le raisonnement octet par octet ne survit que dans le RFC 2083 de 1997 — un document marqué Informatif, que la norme a depuis remplacé. Les octets sont normatifs. Les raisons pour lesquelles ce sont ces octets-là ne le sont pas.
Limites assumées
Une signature dit ce qu’un fichier prétend être, et c’est précisément pourquoi on la vérifie — mais c’est aussi sa limite. Les octets de tête sont faciles à falsifier. Si vous cherchez à savoir si quelque chose est sûr à ouvrir, une signature qui correspond vous apprend que le fichier est assez bien formé pour avoir un en-tête plausible, et rien de plus.
Toutes les signatures ne commencent pas au début. Le marqueur ustar qui identifie une archive tar se trouve à l’octet 257, et le CD001 de l’ISO 9660 à l’octet 32769, soit plus de 32 kilooctets à l’intérieur. Tout ce qui ne lit que les quatre premiers octets rate complètement les deux formats d’archive et d’image disque les plus répandus, d’où la lecture plus profonde de cet outil.
Plusieurs formats sont indiscernables en tête, et l’outil le dit au lieu de deviner. WebP, WAV et AVI commencent par les mêmes quatre octets, parce que tous trois sont des conteneurs RIFF et que les octets qui les séparent viennent ensuite. Un .docx, un .xlsx, un .jar, un .apk et un .epub sont tous des archives ZIP et portent la signature du ZIP ; les distinguer suppose de décompresser et de regarder à l’intérieur, ce qui est un autre travail. Dans les deux cas, toutes les correspondances sont affichées plutôt qu’une seule choisie.
Beaucoup de formats n’ont aucune signature. CSV, texte brut, la plupart du code source et le SVG ne sont que des caractères, sans rien de fixe en tête à comparer — le SVG en particulier est du XML, qui peut commencer ou non par une déclaration. Un fichier qui ne correspond à rien ici ne vous a pas dit grand-chose.
Enfin, 33 formats sont une sélection et non un recensement, et la liste est bornée exprès. La réponse complète de fait, c’est la base magique livrée avec la commande file d’Unix, qui compte des milliers de règles avec logique conditionnelle et arithmétique sur les octets. Cette page présente le sous-ensemble dont les octets peuvent être vérifiés contre un vrai fichier que ses propres tests construisent : chaque ligne y est donc vérifiée et non recopiée.
Pourquoi est-ce gratuit ?
Parce que cela ne coûte rien à faire tourner. La liste fait partie de la page et l’identification a lieu dans votre navigateur : quand vous déposez un fichier, seuls ses premiers octets sont lus, et ils le sont localement. Rien n’est envoyé, aucun serveur ne voit votre fichier, et il n’y a pas de compte.
Le tableau n’est pas recopié d’un autre tableau. Chaque ligne constructible est vérifiée contre un fichier produit par un véritable encodeur, et recoupée avec l’identification de la commande file elle-même : un chiffre interverti casse la compilation au lieu d’atteindre la page. Là où un format n’a pas pu être construit ici, la page le dit plutôt que de le laisser silencieusement non vérifié.