Español

Herramientas de desarrollo · Codificador y decodificador Base64

Una breve historia de Base64: desde uuencode y PEM hasta el alfabeto actual

· Antecedentes

base64 codificación

Línea de tiempo desde uuencode y PEM a través de MIME hasta RFC 4648 Evolución de Base64
Ilustración de vector original de ToolAcre

El alfabeto de Base64 es un registro fósil de los problemas de transporte de la década de 1980. Esta publicación sigue el linaje desde uuencode hasta el correo con privacidad mejorada hasta MIME y RFC 4648, y explica cada elección de diseño.

Por qué el alfabeto no está simplemente 0–63 en algún orden obvio: la pregunta que se remonta a cuatro décadas atrás

Base64 no parecía completamente formado como estándar. El alfabeto (A-Z, a-z, 0-9, +, /) es un registro fósil de décadas de experimentos de codificación, cada uno de los cuales intenta resolver el mismo problema: cómo representar datos binarios como texto que sobreviva al correo electrónico, USENET y las herramientas Unix de los años 1970 y 1980. La historia abarca uuencode en Unix, correo con privacidad mejorada (RFC 1421) en 1993, MIME (RFC 2045) en 1996, y finalmente RFC 4648 en 2006 consolidando todas las variantes.

Comprender esta historia explica por qué ciertos caracteres están en el alfabeto y por qué el RFC dejó ciertas opciones a los implementadores. uuencode, abreviatura de codificación Unix-to-Unix, fue la primera herramienta que resolvió el problema de transporte de 7 bits en Unix. Creado en 1980, codificó cada 3 bytes (24 bits) en 4 caracteres de un alfabeto de 64 caracteres. El alfabeto uuencode era ASCII 32 (espacio) hasta ASCII 95 (guión bajo y otros signos de puntuación), elegido porque esos caracteres se pueden imprimir en cualquier terminal. El repositorio muestra el alfabeto implementado actualmente, pero no contiene evidencia de archivo sobre quién seleccionó ese orden o por qué ganó cada personaje. Por lo tanto, el título se reduce: la disposición actual se puede inspeccionar exactamente, mientras que los motivos y las fechas requieren documentos históricos primarios que no se incluyen aquí.

Por qué el alfabeto parece histórico: un límite que este repositorio no documenta

Sin embargo, el espacio como carácter de codificación es problemático: los editores de texto y los sistemas de correo recortan los espacios finales, corrompiendo la salida. El alfabeto no era ideal, pero funcionó bastante bien para la transferencia de archivos de Unix a Unix. El correo con privacidad mejorada (RFC 1421, 1992) fue uno de los primeros intentos de estandarizar el correo electrónico cifrado. Incluía su propia codificación Base64 (RFC 1341, para MIME, que RFC 1421 era anterior en especificación pero retrasado en adopción).

RFC 1421 Base64 usó el alfabeto A-Z, a-z, 0-9, +, / (el alfabeto base64 moderno) y envolvió líneas en 64 caracteres. Este alfabeto evitaba espacios y otros caracteres problemáticos; cada carácter se puede imprimir sin ambigüedades y no se confunde con códigos de control o variaciones del juego de caracteres nacionales. La longitud de la línea de 64 caracteres coincidía con el ancho de los terminales de papel de la década de 1980 y era un compromiso práctico para la legibilidad. Uuencode pertenece a la historia circundante, pero la herramienta no lee ni escribe su alfabeto. Tratarlo como Base64 intercambiable sería un error de formato. La comparación útil aquí se limita al problema compartido de representar bytes con caracteres imprimibles.

Codificaciones anteriores como contexto, no evidencia de implementación

RFC 1421 no se adoptó ampliamente para el correo electrónico cifrado, pero su alfabeto Base64 sobrevivió. MIME (Extensiones multipropósito de correo de Internet, RFC 2045, 1996) adoptó el alfabeto RFC 1421 Base64 pero cambió el ajuste de línea de 64 a 76 caracteres. La razón no fue técnica sino histórica: los bloques PEM (Correo de privacidad mejorada) eran 64 caracteres y MIME eligió un límite ligeramente diferente para evitar confusión con PEM en el análisis automatizado.

MIME Base64 se convirtió en el estándar para archivos adjuntos de correo electrónico y es la variante Base64 más utilizada en la actualidad. RFC 2045 también definió otros valores de codificación de transferencia de contenido (7 bits, 8 bits, imprimible entre comillas), brindando opciones a los sistemas de correo según el tipo de contenido. La elección del alfabeto evita caracteres que difieren entre ASCII y EBCDIC (la codificación de caracteres del mainframe de IBM). Los caracteres A-Z, a-z, 0-9, + y / son iguales en ambas codificaciones. Los bloques de estilo PEM son reconocibles porque las etiquetas rodean el material codificado envuelto. ToolAcre puede procesar el cuerpo Base64 extraído después de eliminar esas etiquetas. No puede establecer qué especificación de archivo utilizó por primera vez una convención determinada, y este artículo no pretende que el árbol de fuentes responda esa pregunta.

Armadura estilo PEM como formato observable moderno, sin reclamar una historia de origen

Los caracteres como corchetes de apertura y corchetes de cierre difieren entre ASCII y EBCDIC, por lo que fueron excluidos. Esto fue importante en la década de 1980 y principios de la de 1990, cuando la transferencia de datos de mainframe a Unix era común. El alfabeto también evita la barra invertida, las comillas simples y las comillas dobles, que tienen un significado especial en las cadenas C y la sintaxis del shell. Una cadena Base64 se puede incrustar en un programa C o script de shell sin escapar de casi todos los caracteres.

RFC 3548 (2006) codificaciones consolidadas Base64, base32 y base16. Observó que MIME, PEM y otras aplicaciones usaban conceptos similares pero con diferentes reglas de relleno y alfabetos. RFC 4648 (2006, publicado junto con RFC 3548) es el estándar actual y define cinco familias de codificación con vectores de prueba para cada una. El RFC también anota el historial: qué documentos definieron qué codificaciones, qué cambió entre versiones y por qué se tomaron las decisiones. La opción de ajuste de caracteres 76 del codificador y la eliminación de espacios en blanco del decodificador hacen que las muestras en forma de MIME se puedan probar. Esos hechos de implementación no prueban una historia completa de los estándares de correo. Muestran el comportamiento de compatibilidad moderno que los lectores pueden reproducir directamente en el panel y las pruebas.

Ajuste estilo MIME como opción de codificador, sin reconstruir el historial de estándares

La mayoría de los desarrolladores solo encuentran base64 y base64url en RFC 4648; el historial está documentado para aquellos que necesitan implementar las variantes más antiguas. Base64url (RFC 4648 sección 5) reemplaza el signo más con un guión y la barra con guión bajo para evitar caracteres reservados en URL. Una cadena base64 que contenga + y / debe estar codificada en porcentaje en una URL (%2B y %2F); base64url evita eso.

JWT (JSON Web Token) utiliza base64url sin relleno. Algunas aplicaciones utilizan base64url con relleno. El RFC define ambas variantes; Depende de la aplicación cuál elegir. Esta variación es la razón por la cual un decodificador JWT y un decodificador Base64 de correo electrónico pueden producir resultados diferentes para la misma cadena de entrada (uno espera base64url, el otro espera base64). El alfabeto, las reglas de relleno y el ajuste de líneas surgieron de restricciones prácticas de sistemas reales. Es mejor tratar la portabilidad como una limitación de los alfabetos de transporte en lugar de como una biografía verificada de cada símbolo. Las letras y los dígitos siguen siendo visualmente familiares en los sistemas de texto comunes, mientras que la puntuación final difiere en el modo seguro para URL. El fundamento histórico exacto de la selección se omite sin evidencia primaria.

La portabilidad como una restricción de diseño, no como una cuenta verificada de elecciones de personajes individuales.

El conjunto de caracteres 64 se eligió para su representabilidad en todas las codificaciones; el alfabeto fue arreglado por RFC 1341 y 1421 y MIME; la regla de relleno provino de la alineación de 3-bytes; y el ajuste de líneas provino de los límites de transporte de correo electrónico. Una implementación que ignora este historial puede inventar una nueva codificación u olvidar un caso límite. Los vectores de prueba RFC 4648 (foobar produce Zm9vYmFy) son la forma de verificar que una implementación respeta el estándar.

Existen alternativas modernas como base85 (usada en algunos contextos), pero base64 sigue siendo dominante debido al impulso histórico y porque es lo suficientemente bueno. Base64 no es la codificación más compacta (base85 y base91 son más densas), pero es simple, universal y probada. Lo que sí se puede afirmar con firmeza es el par de alfabetos actual: estándar termina en más y barra; La URL segura sustituye el guión y el guión bajo. El acolchado y el envoltorio son opciones independientes. Las pruebas cubren ambos modos y el relleno faltante, proporcionando evidencia reproducible del comportamiento actual en lugar de una cronología inferida.

Lo que demuestra el repositorio sobre los alfabetos estándar actuales y seguros para URL

El tamaño porcentual del 33 es aceptable para la mayoría de los usos. El alfabeto es estable en todas las implementaciones. El RFC es lo suficientemente claro en cuanto a que las desviaciones suelen ser deliberadas (como la omisión de relleno o el manejo de espacios en blanco) en lugar de malentendidos accidentales.

Comprender el historial de Base64 explica por qué tiene el aspecto que tiene. Los caracteres más y barra fueron elecciones deliberadas para evitar ambigüedades en diferentes codificaciones de caracteres. La regla de relleno provino de la agrupación de 3 bytes. Base85 y Ascii85 utilizan diferentes tamaños de grupo y alfabetos y están fuera de la implementación. Mencionarlos no convierte a esta página en un convertidor para ellos. Comparar su densidad o historial requeriría fuentes y vectores de prueba más allá de los archivos Base64 revisados ​​para este módulo.

Conclusión: cada carácter fue elegido por una razón: cómo el codificador y descodificador Base64 implementa el alfabeto estándar resultante

El ajuste de línea provino de un correo electrónico. Cada decisión se tomó para resolver un problema real con sistemas reales. Hoy en día, Base64 se usa principalmente en contextos (JWT, API, URI de datos) donde el historial no importa, pero el alfabeto y las reglas de relleno se heredan de MIME y PEM a través del RFC 4648.

Leer el RFC una vez y codificar una cadena de prueba en la herramienta codificadora y decodificadora Base64 conecta el estándar actual con sus raíces históricas. El alfabeto estándar resultante es visible siempre que la entrada alcanza los índices sesenta y dos o sesenta y tres. Utilice una muestra que produzca esas posiciones, cambie el modo seguro de URL y compare solo la puntuación modificada. Ese experimento demuestra el formato actual sin depender de una historia sin fundamento sobre su invención.