También disponible en: English · Português · Français · العربية
Firmas de archivo y números mágicos
Los números mágicos de 33 formatos, cada uno con el documento que de verdad lo define, y un identificador que lee solo la cabecera en tu navegador.
¿Qué es una firma de archivo?
Una firma de archivo, o número mágico, es una secuencia corta y fija de bytes al principio de un archivo que dice de qué tipo es. Todos los PNG empiezan por los mismos ocho bytes; todos los archivos gzip por los mismos dos. Los programas los leen porque el nombre no es una prueba: renombrar una hoja de cálculo como .png no cambia nada de lo que hay dentro, y un archivo que llega de internet tiene el nombre que quiso ponerle quien lo envió.
La lista de abajo trae 33 formatos con sus bytes, en qué punto del archivo están y el tipo de medio cuando está registrado. Lo que además trae, y que las tablas copiadas unas de otras se dejan, es el documento que define cada firma. Esa columna resulta ser la interesante.
Porque la respuesta no es uniforme. Algunas firmas están fijadas en el texto normativo de una norma publicada. Otras solo en la documentación del propio fabricante. Otras en un documento que ya no tiene ningún peso. Y unas cuantas —ICO, bzip2, 7-Zip— las implementan igual todas las herramientas del mundo y no se escribieron nunca en ninguna parte como requisito.
Cómo usarlo
- Suelta un archivo, o elígelo. Solo se lee la cabecera, y la lee tu navegador. No se sube nada. Si alguna firma coincide, obtienes el formato, los bytes que coincidieron y dónde están definidos.
- O pega los bytes que ya tengas. Si estás mirando un volcado hexadecimal, pega los primeros bytes. Se aceptan espacios, prefijos 0x y minúsculas; solo hace falta un número par de dígitos.
- Busca en la lista por cualquier cosa de la fila. Sirven el nombre del formato, una extensión, un tipo de medio, un prefijo hexadecimal o el nombre de una especificación. Escribir png pone PNG primero en vez de enterrarlo bajo todo lo que contenga esas letras.
La firma de PNG, y la explicación que la norma dejó caer
PNG es el formato que merece mirarse de cerca, porque sus ocho bytes son los mejor diseñados de la lista y su historia no es la que esperarías. Son 137, 80, 78, 71, 13, 10, 26, 10; en texto, un byte con el bit alto puesto, luego PNG, luego un retorno de carro, un salto de línea, un control-Z y otro salto de línea.
Cada uno hace su trabajo. El primer byte no es deliberadamente un carácter ASCII, para que un archivo de texto no se confunda con un PNG y, sobre todo, para cazar una transferencia que borre el bit alto de cada byte. El retorno de carro y el salto de línea cazan el problema contrario: una transferencia que convierta amablemente los finales de línea entre plataformas destroza esa pareja, y el archivo falla en el byte cinco en vez de en algún punto profundo de la imagen. El control-Z impide que MS-DOS vuelque el resto de un binario en la terminal cuando alguien lo escribe. El salto de línea final caza el inverso de la conversión CR-LF.
Y aquí está la parte que nos sorprendió. Esa explicación no está en la norma actual. ISO/IEC 15948, que es lo que normaliza PNG hoy, enuncia los ocho bytes y sigue adelante, dejando una sola frase en su apartado de justificación para decir que la firma detecta errores comunes de transmisión. El razonamiento byte a byte sobrevive únicamente en la RFC 2083 de 1997, un documento marcado como Informativo al que la norma ha sustituido. Los bytes son normativos. Las razones por las que son esos bytes, no.
Límites honestos
Una firma dice lo que un archivo afirma ser, y ese es justo el motivo para comprobarla, pero también su límite. Los bytes del principio son baratos de falsificar. Si estás decidiendo si algo es seguro de abrir, una firma que coincide te dice que el archivo está lo bastante bien formado como para tener una cabecera plausible y nada más.
No todas las firmas empiezan al principio. El marcador ustar que identifica un archivo tar está en el byte 257, y el CD001 de ISO 9660 en el byte 32769, más de 32 kilobytes dentro. Cualquier cosa que lea solo los primeros cuatro bytes se pierde por completo los dos formatos de archivo comprimido y de imagen de disco más comunes, y por eso esta herramienta lee más lejos.
Varios formatos son indistinguibles en la cabecera, y la herramienta lo dice en vez de adivinar. WebP, WAV y AVI empiezan por los mismos cuatro bytes, porque los tres son contenedores RIFF y los bytes que los separan vienen después. Un .docx, un .xlsx, un .jar, un .apk y un .epub son todos archivos ZIP y llevan la firma de ZIP; distinguirlos exige descomprimir y mirar dentro, que es otro trabajo. En ambos casos se muestran todas las coincidencias en lugar de elegir una.
Muchos formatos no tienen firma ninguna. CSV, texto plano, casi todo el código fuente y SVG son solo caracteres, y no hay nada fijo al principio con lo que comparar: SVG en particular es XML, que puede empezar o no por una declaración. Un archivo que no coincide con nada de aquí te ha dicho muy poco.
Por último, 33 formatos son una selección y no un censo, y la lista está acotada a propósito. La respuesta completa de facto es la base de datos mágica que acompaña al comando file de Unix, con miles de reglas, lógica condicional y aritmética de bytes. Lo que hay en esta página es el subconjunto cuyos bytes se pueden comprobar contra un archivo real que las pruebas de esta página construyen, así que cada fila está verificada y no transcrita.
¿Por qué es gratis?
Porque no cuesta nada mantenerlo. La lista forma parte de la página y la identificación ocurre en tu navegador: cuando sueltas un archivo, solo se leen sus primeros bytes, y se leen en local. No se sube nada, ningún servidor ve tu archivo y no hay cuenta.
La tabla no está copiada de otra tabla. Cada fila que se puede construir se comprueba contra un archivo producido por un codificador real, y se contrasta con la identificación del propio comando file, así que un dígito transpuesto rompe la compilación en vez de llegar a la página. Donde un formato no se ha podido construir aquí, la página lo dice en vez de dejarlo sin verificar en silencio.