Qué es Base64: codificación, no cifrado

Base64 no esconde nada. Convierte cualquier dato en letras, cifras y unos pocos símbolos para que pueda viajar por sistemas que solo entienden texto, y cualquiera lo deshace en un segundo. Conviene saber cómo funciona, porque aparece en correos, tokens y URL, y porque los fallos al usarlo son siempre los mismos.

Revisado el 3 de octubre de 2026 · 4 min de lectura

Qué hace Base64

El RFC 4648 define Base64 como una forma de representar secuencias arbitrarias de bytes con un formato que admite mayúsculas y minúsculas y que no tiene por qué ser legible por personas. Usa un subconjunto de 65 caracteres de US-ASCII: 64 para llevar datos (A–Z, a–z, 0–9, + y /), suficientes para representar 6 bits cada uno, más = para el relleno.

El proceso toma la entrada de tres en tres bytes (24 bits), los divide en cuatro grupos de 6 bits y convierte cada uno en un carácter. Esa es toda la idea, y explica los dos hechos que todos deberían conocer: el resultado se compone solo de caracteres imprimibles y es aproximadamente un tercio mayor que la entrada, porque 3 bytes pasan a ser 4 caracteres. Diez bytes se convierten en 16 caracteres, 1.000 bytes en 1.336 y 3 MB en 4 MB.

Un ejemplo corto: el texto Ana:clave se codifica como QW5hOmNsYXZl. Pégalo en el codificador y decodificador de Base64 y recuperas el original, que es justo la idea.

No es cifrado

Este es el malentendido con consecuencias. Base64 no tiene clave ni secreto: decodificar es un paso mecánico que cualquiera puede hacer. Se usa para hacer los datos transportables, no privados. Si una contraseña, un token o un documento están «protegidos» solo con Base64, no están protegidos.

La autenticación «Basic» de HTTP muestra cómo se traduce esto. Envía el nombre de usuario y la contraseña unidos por dos puntos y codificados en Base64. El RFC 7617 afirma con claridad que ese esquema no es un método seguro de autenticación salvo que se use con algo como TLS, porque el usuario y la contraseña viajan por la red en claro. Base64 ahí es solo un envoltorio cómodo, y la seguridad la pone (o no) HTTPS. Lo mismo vale para la carga de un JWT, que está codificada en base64url y la puede leer cualquiera que tenga el token (mira cómo leer un JWT).

Dónde te lo vas a encontrar

  • Adjuntos de correo. El correo se diseñó para texto; los archivos se codifican en Base64 (MIME) para viajar dentro del mensaje. Es una de las razones de que un adjunto añada más o menos un tercio al tamaño en la red.
  • URI de datos. Las imágenes pequeñas incrustadas directamente en HTML o CSS tienen el aspecto data:image/png;base64,iVBOR…. Cómodo para iconos diminutos, poco eficiente para imágenes grandes por el tercio extra y porque no se pueden guardar en caché por separado.
  • JSON y API. JSON no tiene un tipo binario, así que archivos y claves se envían a menudo como cadenas Base64.
  • Tokens y claves. Los JWT, los certificados en formato PEM y muchas claves de API usan Base64 o su variante para URL.

El relleno: por qué a veces hay un =

La entrada llega en grupos de tres bytes. Cuando el último grupo solo tiene uno o dos bytes, la salida se rellena con signos = para que su longitud sea múltiplo de 4: un byte sobrante da dos =, dos bytes sobrantes dan uno. El relleno no lleva información; solo dice al decodificador cuántos bytes tenía el último grupo. El RFC 4648 indica que cuando la longitud de los datos se conoce de antemano el relleno se puede omitir, y es lo que suele hacer base64url.

Base64url: la variante para URL

Los caracteres + y / tienen significado especial en las URL y los nombres de archivo. La sección 5 del RFC 4648 define una variante que los sustituye por - y _, y dice que debe llamarse «base64url» y no solo «base64». La usan los JWT. Confundirlas es una fuente habitual de errores al decodificar: una cadena base64url que se pasa a un decodificador normal falla en cuanto encuentra un - o un _. Por ejemplo, los tres bytes 251, 255, 254 se codifican como +//+ en Base64 y como -__- en base64url.

El problema de las tildes (btoa y atob)

Base64 codifica bytes, no texto, así que importa cómo se convierte el texto en bytes. En los navegadores, btoa() trata cada carácter como un byte, lo que solo funciona con puntos de código menores de 256. MDN documenta que pasar un carácter que no cabe en un byte lanza un InvalidCharacterError (prueba btoa("€")). Y aunque no falle, puedes obtener un resultado distinto del de otras herramientas: btoa("Mañana") da TWHxYW5h, porque la «ñ» se trata como el byte único 0xF1, mientras que un codificador UTF-8 da TWHDsWFuYQ==, con la «ñ» como dos bytes. Cuando intercambies texto en Base64 con otros sistemas, lo correcto casi siempre es convertir primero el texto a bytes UTF-8 y codificar después. La herramienta de arriba lo hace así.

Errores habituales al decodificar

  • Carácter o longitud no válidos: espacios, saltos de línea o un carácter que falta al copiar y pegar. Algunos decodificadores toleran los espacios en blanco y otros no.
  • Alfabeto equivocado: una cadena para URL (-, _) enviada a un decodificador estándar, o al revés.
  • Relleno ausente: algunos decodificadores exigen los =; añádelos hasta que la longitud sea múltiplo de 4.
  • Texto deformado tras decodificar: los bytes se decodificaron bien, pero se leyeron con el juego de caracteres equivocado. Si el original era UTF-8, léelo como UTF-8.

Fuentes y más información

Datos comprobados el 3 de octubre de 2026.

Hazlo ahora, gratis y en tu navegador. Tus archivos no se suben.

Convierte texto, archivos e imágenes a Base64 y de vuelta, en tu navegador.

Preguntas frecuentes

¿Es Base64 un cifrado?
No. Es una codificación reversible sin clave. Cualquiera puede decodificarla, así que no protege contraseñas ni otros secretos.
¿Por qué el resultado de Base64 ocupa más que la entrada?
Porque cada 3 bytes de entrada pasan a ser 4 caracteres, así que el resultado es aproximadamente un tercio (33 %) mayor, más un poco de relleno.
¿Qué significa el = del final?
Es relleno, para que la longitud sea múltiplo de 4. Un byte que falta en el último grupo da dos signos =, y dos bytes que faltan dan uno. No lleva datos.
¿Qué diferencia hay entre Base64 y Base64url?
Base64url sustituye + y / por - y _ para que el texto sea seguro en URL y nombres de archivo, y suele omitir el relleno. Los JWT lo usan.
¿Por qué btoa() falla con tildes o con el signo del euro?
Porque btoa() solo acepta caracteres que caben en un byte. Caracteres como el euro lanzan un InvalidCharacterError, y otros como la ñ se codifican distinto de UTF-8. Convierte antes el texto a bytes UTF-8.
¿Es seguro enviar una contraseña en Base64 en una cabecera HTTP?
Solo por HTTPS. La autenticación Basic envía las credenciales codificadas, no protegidas; el RFC 7617 dice que no es segura sin algo como TLS.