Base64 es uno de esos formatos que todo desarrollador ha usado pero pocos pueden explicar sin pausar. Parece caracteres aleatorios. Hace los datos más grandes. Y sin embargo es la columna vertebral de los adjuntos de correo electrónico, los payloads de JWT, las imágenes en línea en CSS y docenas de otros protocolos que necesitan mover datos binarios a través de canales de solo texto.
La versión corta: Base64 codifica datos binarios arbitrarios como caracteres ASCII imprimibles. La versión larga involucra un alfabeto de 64 caracteres, reglas de relleno y algunas variantes que confunden a la gente en producción.
Por qué existe Base64
Muchos sistemas fueron diseñados para transportar solo texto — correo electrónico (SMTP), URLs, XML, JSON. Si quieres enviar un archivo binario a través de uno de esos conductos, necesitas una forma de representar bytes como caracteres. Base64 resuelve esto mapeando cada 3 bytes de entrada a 4 caracteres de salida, usando solo caracteres que son seguros en prácticamente cualquier protocolo de texto.
El compromiso: Base64 aumenta el tamaño de los datos en aproximadamente un 33%. Una imagen de 1KB se convierte en aproximadamente 1.3KB de texto. Para la mayoría de los casos de uso está bien. Para sistemas de alto rendimiento importa, y verás alternativas como Base85 o protocolos binarios sin procesar.
Los 64 caracteres
El alfabeto es:
A-Z (26 caracteres)
a-z (26 caracteres)
0-9 (10 caracteres)
+ / (2 caracteres)
Eso es 64 caracteres en total, de ahí el nombre. El carácter = se usa para relleno cuando la longitud de la entrada no es un múltiplo de 3 bytes.
Cada carácter en el alfabeto es ASCII imprimible, lo que significa que la salida de Base64 puede viajar por correo electrónico, aparecer en cadenas de JSON, estar dentro de atributos HTML y sobrevivir sistemas que podrían dañar el binario sin procesar.
Cómo funciona la codificación
Toma tres bytes de entrada. Cada byte tiene 8 bits, así que tienes 24 bits en total. Base64 divide esos 24 bits en cuatro grupos de 6 bits. Cada grupo de 6 bits se mapea a un carácter en el alfabeto:
000000→A000001→B- …
111111→z
Eso es todo. La codificación es una transformación simple a nivel de bits sin clave, sal ni secreto. Cualquiera puede decodificar Base64 invirtiendo la tabla de búsqueda.
Relleno
Si la longitud de la entrada no es un múltiplo de 3, el relleno llena el espacio:
- 1 byte restante → 2 caracteres Base64 +
== - 2 bytes restantes → 3 caracteres Base64 +
= - 0 bytes restantes → sin relleno
Los caracteres de relleno no llevan datos. Existen para que la longitud de la salida siempre sea un múltiplo de 4, que muchos analizadores esperan.
Variantes
No todo Base64 es idéntico:
- Base64 estándar (
A-Za-z+/=) — el predeterminado, usado en correos MIME y la mayoría de los protocolos. - Base64 seguro para URLs (
A-Za-z-_) — reemplaza+con-y/con_, elimina el relleno. Usado en JWTs, parámetros de URL y nombres de archivo. - Base64 sin relleno — algunos sistemas omiten los caracteres
=. La salida es más corta pero algunos analizadores fallan con ella.
Cuando estás depurando un JWT o un data URI y la decodificación falla, lo primero que verificar es si el codificador usó Base64 seguro para URLs o Base64 estándar. Un - en medio de lo que esperabas que fuera una cadena Base64 estándar es la señal reveladora.
Dónde los desarrolladores encuentran Base64 realmente
Adjuntos de correo electrónico. MIME (RFC 2045) usa Base64 para codificar adjuntos binarios. Si alguna vez has visto un archivo .eml con cadenas largas de caracteres aleatorios, eso es contenido codificado en Base64.
Payloads de JWT. Las tres partes de un JWT (encabezado, payload, firma) están cada una codificada en Base64 seguro para URLs. Cuando decodificas un JWT, estás invirtiendo la codificación Base64url en cada segmento.
Data URIs. data:image/png;base64,iVBOR... te permite incrustar una imagen directamente en HTML o CSS. Los bytes de la imagen están codificados en Base64 para que puedan aparecer en un atributo de texto.
APIs. Algunas APIs aceptan o devuelven datos binarios codificados en Base64 (carga de archivos, procesamiento de imágenes, firmas criptográficas). Es menos común ahora que la mayoría de las APIs soportan datos de formulario multipart, pero aún aparece.
Embebidos. Los modelos de aprendizaje automático a veces almacenan embebidos como cadenas Base64 en JSON. No es ideal para rendimiento, pero es conveniente para transporte.
Cuándo NO usar Base64
No lo uses para cifrado. Base64 es una codificación, no cifrado. Cualquiera puede decodificarla. Si estás poniendo datos sensibles en Base64, solo los estás oscureciendo, no protegiendo.
No lo uses para compresión. Base64 hace los datos más grandes, no más pequeños. Si estás codificando en Base64 datos que ya están comprimidos (como un archivo .gz), estás añadiendo sobrecarga sin beneficio.
No lo uses en rutas críticas de rendimiento. La codificación/decodificación añade tiempo de CPU y aumenta el tamaño del payload. Para APIs internas de alta frecuencia, usa protocolos binarios (protobuf, msgpack) en su lugar.
No olvides la variante. Si estás generando Base64 para una URL o un JWT, usa Base64 seguro para URLs. Si estás generando para correo o transporte general, usa Base64 estándar. Mezclarlos causa corrupción silenciosa de datos.
Referencia rápida
| Escenario | Variante | Relleno |
|---|---|---|
| JWT | Seguro para URLs | No |
| Correo / MIME | Estándar | Sí |
| Data URI | Estándar | Opcional |
| Parámetro de URL | Seguro para URLs | No |
| Transporte general | Estándar | Sí |
Pruébalo
Si tienes una cadena Base64 que necesitas decodificar, o datos binarios que necesitas codificar, usa una herramienta basada en navegador para que la conversión ocurra localmente — tus datos no se envían a un servidor para algo tan simple.