La codificación Base64

Cómo se convierte cualquier fichero en un texto de 64 caracteres seguros, por qué ocupa un tercio más y qué pintan los signos de igual del final.

5 min
Editar

Base64 es una manera de escribir cualquier secuencia de bytes usando solo 64 caracteres: las 26 letras mayúsculas, las 26 minúsculas, los diez dígitos, el signo más y la barra. Toma los bytes de tres en tres, que son 24 bits, los reparte en cuatro grupos de seis, y cada grupo de seis bits, que es un número entre 0 y 63, se escribe con el carácter que ocupa ese puesto en el alfabeto. Tres bytes se convierten en cuatro caracteres, siempre. No es un cifrado, aunque a veces se confunda con uno: cualquiera que vea el texto puede deshacer la operación, y la tabla de equivalencias es pública desde hace cuarenta años.

La figura de esta página hace la conversión paso a paso con lo que se escriba. Arriba está el texto, debajo sus bytes tal y como los guarda la codificación UTF-8, debajo los bits de esos bytes de ocho en ocho, luego los mismos bits recortados de seis en seis, y al final el carácter que corresponde a cada grupo. Cuando el número de bytes no es múltiplo de tres, el último grupo se completa con ceros y el resultado se rellena con uno o dos signos de igual hasta llegar a un múltiplo de cuatro caracteres; con cuatro letras se ve el relleno, con seis no.

Interactivo Escribe algo (hasta seis bytes). Cada fila es un paso: los bytes del texto, sus bits de ocho en ocho, los mismos bits agrupados de seis en seis y el carácter de Base64 que toca a cada grupo. Los ceros añadidos y los signos de igual del relleno van en gris.

La razón de que exista es que internet se construyó para texto. El protocolo con el que los servidores de correo se pasan los mensajes, SMTP, fue definido por Jon Postel en 1982 sobre líneas de caracteres ASCII de siete bits. Durante años, muchos de los programas que había por el camino lo tomaron al pie de la letra: ponían a cero el octavo bit de cada byte, cambiaban los finales de línea, cortaban las líneas largas y trataban ciertos valores como órdenes. Un mensaje de texto llegaba intacto; una imagen o un programa, que usan los 256 valores de un byte sin distinción, llegaba destrozado. Para mandar un fichero binario había que disfrazarlo de texto, y hacerlo con un repertorio de caracteres tan inofensivo que ningún intermediario tuviera motivo para tocarlo.

Las soluciones anteriores habían sido peores. El programa uuencode de Unix, de 1980, usaba 64 caracteres consecutivos de ASCII que incluían el espacio y signos de puntuación, y algunas pasarelas de correo los alteraban igual. El alfabeto de Base64 se eligió en 1987 para el correo cifrado del estándar PEM, cuidando que sus 64 caracteres existieran y fueran los mismos en todas las codificaciones de texto en uso, incluida la EBCDIC de los grandes ordenadores de IBM, que no coincide con ASCII en casi nada. Nathaniel Borenstein y Ned Freed lo adoptaron en 1992 para MIME, la extensión que permitió al correo llevar adjuntos, y desde entonces cada fichero que viaja pegado a un mensaje va en Base64 aunque el usuario nunca lo vea. Simon Josefsson recogió en 2006, en el documento que sigue siendo la referencia, las variantes que se habían ido añadiendo, entre ellas la que sustituye el signo más y la barra por el guion y el guion bajo para poder meter el resultado en una dirección web sin que haya que escaparlo.

El precio es el tamaño. Cuatro caracteres por cada tres bytes es un 33 por ciento más, y el formato original del correo añade un salto de línea cada 76 caracteres, con lo que un adjunto ocupa más de un tercio más que el fichero que contiene. Por eso 64 y no más: es la mayor potencia de dos que cabe en el repertorio de caracteres a salvo de todas las manipulaciones, y una potencia de dos es lo que hace que el reparto de bits sea limpio. Con 32 caracteres, Base32, cada byte cuesta un 60 por ciento más, y con los 16 del hexadecimal, Base16, el doble. Se usan cuando importa más que se pueda dictar por teléfono o escribir sin confundir la o con el cero que ahorrar espacio.

Hoy Base64 está en más sitios que el correo. Las imágenes pequeñas que una página web lleva incrustadas en lugar de descargarlas aparte van como una dirección que empieza por data: seguida del fichero en Base64. Los tokens con los que una aplicación demuestra que ha iniciado sesión son tres bloques de Base64 separados por puntos, y leerlos es tan fácil como decodificarlos. Las claves públicas, los certificados y las claves de SSH se guardan en ficheros de texto en los que las líneas que empiezan por «—–BEGIN» encierran la clave en Base64. Y la autenticación básica de la web manda el usuario y la contraseña juntos y en Base64 en cada petición, lo que ha hecho creer a más de un principiante que iban cifrados; no lo van, y por eso solo se usa sobre conexiones que ya cifran por su cuenta.

Lo que enseña, al final, es una distinción que la informática no deja de recordar: los bytes y los caracteres no son lo mismo. Un fichero es una lista de números de cero a 255; un texto es una lista de signos que alguien ha acordado cómo representar con números. Base64 es el puente para cuando el canal solo admite lo segundo y hay que pasar lo primero, y la mitad de los adjuntos rotos y de los textos con caracteres extraños de la historia del correo vienen de haber confundido las dos cosas.

La codificación UTF-8 – Los bits – La clave pública – El sistema binario – La compresión de Lempel-Ziv

§

Fuentes

  1. Jonathan B. PostelRFC 821: Simple Mail Transfer ProtocolIETF1982enlace
  2. John LinnRFC 989: Privacy Enhancement for Internet Electronic MailIETF1987enlace
  3. Nathaniel Borenstein y Ned FreedRFC 1341: MIME (Multipurpose Internet Mail Extensions)IETF1992enlace
  4. Simon JosefssonRFC 4648: The Base16, Base32, and Base64 Data EncodingsIETF2006enlace
Sarasola, Josemari (2024). "La codificación Base64". Ikusmira. Recuperado de https://ikusmira.org/p/la-codificacion-base64/

Una errata, un dato desfasado, un párrafo que falta: edítalo y la redacción revisa tu propuesta.

Sugerir una mejora →
Informática La codificación Base64