Qué es la codificación Base64 y cuándo usarla

· 9 min de lectura

Si trabajas con APIs, sistemas de email o desarrollo web, te has encontrado con Base64 aunque no lo reconocieras. Esas cadenas largas de letras y números que parecen galimatías al principio de un adjunto de email, en una URL data: en CSS, o en el segmento del medio de un token JWT? Eso es Base64. Es una de las piezas más antiguas y discretamente cargadas de la fontanería de internet, y casi cada pieza de software que usas se apoya en ella en alguna parte.

Breve historia de Base64

Base64 forma parte de una familia llamada «radix-64» o «codificaciones imprimibles», cuyo trabajo es representar bytes arbitrarios usando solo el pequeño alfabeto de caracteres que un sistema basado en texto garantiza pasar sin cambios. El miembro más utilizado primero es uuencode, escrito por Mary Ann Horton en UC Berkeley hacia 1980 para enviar archivos binarios por Usenet y email cuando esos sistemas corrompían cualquier cosa por encima del ASCII de 7 bits.

El alfabeto de Base64 fue estandarizado por primera vez en RFC 989 (1987) para Privacy-Enhanced Mail (PEM), un primer intento de email firmado y cifrado. PEM murió, pero su esquema de codificación sobrevivió y fue canonizado en RFC 1421 (1993) y luego en la especificación MIME (RFC 1521 y 1522 en 1993, revisadas a RFC 2045-2049 en 1996). MIME hizo de Base64 la forma por defecto de adjuntar archivos binarios al email, y desde ahí la codificación se extendió a casi cualquier transporte de solo texto en internet.

En 2006, IETF consolidó las definiciones dispersas de Base64 en RFC 4648, que define Base64, Base32 y Base16 en un solo documento. RFC 4648 también definió la variante URL-safe en la sección 5, que cambió los dos caracteres no aptos para URL (+ y /) por - y _. JSON Web Tokens (RFC 7519, 2015) estandarizó en Base64 URL-safe con el padding eliminado. Hoy, cada adjunto de email, cada certificado codificado en PEM, cada URL data:, cada JWT y cada límite de subida multipart depende de Base64.

Cómo funciona Base64: las matemáticas

Base64 toma tres bytes de entrada (24 bits) y los reescribe como cuatro caracteres de salida (6 bits cada uno), usando un alfabeto de 64 símbolos. El mapeo es fijo:

Rango de índiceCaracteres
0-25A-Z
26-51a-z
52-610-9
62+ (estándar) o - (URL-safe)
63/ (estándar) o _ (URL-safe)

Así Hello se convierte en:

La salida siempre es múltiplo de 4 caracteres. Si la longitud de entrada módulo 3 es 1, obtienes dos caracteres = de padding; si es 2, obtienes uno; si es 0, ningún padding. El padding a veces se elimina (notablemente en JWT y en fragmentos de URL) y se espera que los decodificadores lo toleren.

El overhead del 33 % viene de esta expansión 3-a-4: cada 3 bytes de entrada se vuelven 4 caracteres de salida, un aumento de un tercio. No hay forma de reducirlo sin cambiar el alfabeto (Base85 / Ascii85 expande solo un 25 % usando 85 caracteres imprimibles, a costa de un codificador más complejo).

Casos de uso comunes

Adjuntos de email. SMTP, el protocolo que mueve el 95 % del email entre servidores, se diseñó en 1982 (RFC 821) para ASCII de 7 bits. Cada adjunto binario que envías (una imagen, un PDF, un ZIP) lo codifica en Base64 tu cliente de correo antes de transmitirlo y lo decodifica el del destinatario. Las cabeceras MIME en el email le dicen al destinatario qué partes son Base64 y cuáles son texto plano.

URLs data en HTML y CSS. Una URL data:image/png;base64,iVBORw0KGgo... embebe un archivo binario directamente en el documento. Útil para iconos pequeños bajo 1-2 KB, donde la petición HTTP ahorrada pesa más que el overhead del 33 % y la pérdida de caché.

Cargas útiles de API. Cuando una API JSON o XML necesita aceptar un valor binario (un archivo subido, una firma, una foto de perfil), el patrón estándar es codificar los bytes en Base64 y enviarlos como campo de cadena. El receptor los decodifica en el lado servidor. Así funciona la entrada de imagen de OpenAI, así Stripe recibe subidas de archivos y así la mayoría de funciones cloud aceptan entrada binaria.

HTTP Basic Authentication. La cabecera Authorization: Basic <token> lleva un par username:password codificado en Base64 (RFC 7617). Es codificación, no cifrado: cualquiera que vea la cabecera ve la contraseña. Basic Auth requiere HTTPS por esa razón.

Certificados y claves. Los archivos PEM (-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----) envuelven un blob de bytes ASN.1 codificados en DER, codificados en Base64. Cada certificado TLS, cada archivo de clave SSH, cada certificado de firma de código es Base64 dentro de un sobre PEM.

Tokens JWT. Un JWT son tres segmentos Base64 URL-safe separados por puntos: <header>.<payload>.<signature>. La codificación Base64 permite que un JWT viaje seguro en cabeceras, URLs y cookies.

Cómo codificar y decodificar

  1. Elige codificar o decodificar: selecciona la dirección de conversión.
  2. Pega texto o sube un archivo: introduce texto directamente o arrastra y suelta un archivo (hasta 5 MB para codificación en navegador).
  3. Elige la variante: Base64 estándar para email y certificados, URL-safe para JWT y fragmentos de URL. La herramienta usa estándar por defecto.
  4. Copia el resultado: la salida se actualiza al instante. Cópiala al portapapeles, o usa el botón de descarga para salidas largas.

Variantes de Base64

Existen varias codificaciones tipo Base64 para situaciones específicas:

VarianteDiferenciasDónde se usa
Estándar (RFC 4648 §4)A-Z, a-z, 0-9, +, /, = paddingEmail (MIME), PEM, transporte binario genérico
URL-safe (RFC 4648 §5)+ se vuelve -, / se vuelve _JWT, fragmentos de URL, nombres de archivo
MIME (RFC 2045)Saltos de línea cada 76 caracteresCuerpo de email, cabeceras (con =?utf-8?B?...?=)
crypt(3) / htpasswdAlfabeto diferente (./0-9A-Za-z)Antiguos hashes Unix (basados en DES)
Base64Url sin paddingURL-safe sin = finalJWT (según RFC 7515)
Base32 (RFC 4648 §6)Alfabeto 32 caracteres, insensible a mayúsculasSecretos TOTP, direcciones Onion
Base58Alfabeto 58 caracteres (sin 0, O, I, l)Direcciones Bitcoin, CIDs IPFS
Ascii85 / Base85Alfabeto 85 caracteres, overhead 25 %PDF, PostScript

La mayoría de las veces quieres Base64 estándar o URL-safe. Las demás aparecen en protocolos específicos.

Cuándo usar Base64

Úsalo cuando:

No lo uses cuando:

Errores comunes

Alternativas y codificaciones vecinas

Base64 es el valor por defecto, no la única opción. La elección correcta depende del canal y del presupuesto de tamaño.

CodificaciónOverheadFortalezaMejor para
Hex (Base16)100 %Trivial de leer, cada byte son dos caracteresSalida de debug, identificadores cortos, códigos de color
Base32 (RFC 4648)60 %Insensible a mayúsculas, sin caracteres ambiguosSecretos TOTP, direcciones Onion, dictado por voz
Base64 estándar33 %Universal, cada lenguaje lo tieneEmail, PEM, transporte genérico
Base64 URL-safe33 %Seguro para URLs y nombres de archivoJWT, fragmentos de URL
Base58~37 %Sin confusión 0/O/I/l, sin caracteres especialesDirecciones Bitcoin, CIDs IPFS
Ascii85 / Base8525 %Más denso que Base64PDF, PostScript
Base91~22 %Aún más denso, más complejoRaro, contextos de compresión de nicho
Subida multipart0 %Transporte binario nativo por HTTPSubidas de archivos (los navegadores lo hacen por ti)
gzip + Base64varíaA veces más pequeño que Base64 crudoCargas pre-comprimidas

Para la mayoría del trabajo diario, la respuesta es Base64 (estándar o URL-safe). Para subidas binarias sobre HTTP, la respuesta correcta es normalmente multipart/form-data, que no codifica nada.

Privacidad y el codificador

El codificador y decodificador Base64 corre enteramente en tu navegador. El texto o archivo que introduces lo procesa JavaScript en tu dispositivo, el resultado se renderiza en la página y no se envía nada a un servidor. No se registra nada, no se guarda nada después de salir de la página, y ningún tag de analytics ve el contenido. Para cosas que podrías codificar en Base64 (certificados PEM, claves privadas, cargas útiles JWT de sistemas de producción, borradores de peticiones API con datos reales de cliente), ese flujo estrictamente local es el valor por defecto correcto. La herramienta entera puede correr offline una vez cargada la página, lo que puedes verificar desconectando la red y recodificando la misma entrada.

Preguntas frecuentes

¿Base64 cifra mis datos?

No. Base64 es una codificación, no un cifrado. Cualquiera puede decodificar una cadena Base64, no aporta ninguna seguridad. Si quieres proteger datos, usa un cifrado real (AES, RSA, etc.).

¿Por qué Base64 hace los archivos más pesados?

La codificación Base64 aumenta el tamaño de los datos en cerca del 33 %. Tres bytes binarios pasan a ser cuatro caracteres Base64. Esa sobrecarga es el precio a pagar para transmitir binario con seguridad como texto.

¿Puedo codificar archivos, no solo texto?

Sí. Cualquier archivo (imágenes, PDF, audio) puede codificarse en Base64. Es habitual para integrar imágenes pequeñas directamente en HTML o CSS en forma de Data URL.

¿Cuándo NO usar Base64?

No lo uses para archivos grandes. Una imagen de 1 MB pasa a 1,33 MB en texto Base64, y el navegador no puede cachearla por separado. Para cualquier cosa que supere unos pocos KB, servir el archivo normalmente es más eficiente.

What is the difference between standard Base64 and URL-safe Base64?

Standard Base64 (RFC 4648 section 4) uses the characters A-Z, a-z, 0-9, +, / with = padding. URL-safe Base64 (RFC 4648 section 5) swaps + for - and / for _ so the string is safe to drop into a URL or a filename without percent-encoding. JWT tokens use the URL-safe variant.

Why does Base64 sometimes have one or two = signs at the end?

The = is padding. Base64 encodes input in 3-byte groups; if the input length is not a multiple of 3, the last group is padded with zero bits and one or two = characters mark the missing bytes. One = means one missing byte, two = means two missing bytes.