design

Explicación de Base64: Cuándo y por qué lo usan los desarrolladores (y sus trampas)

Qué hace Base64 (3 bytes a 4 caracteres ASCII, +33% de tamaño), los casos de uso reales (data URIs, JWT, Basic auth), y las trampas: no es cifrado ni compresión.

Published 2026-06-11 · 8 min read

Affiliate disclosure

Some links below are affiliate links. I may earn a commission from qualifying purchases at no extra cost to you. I only recommend tools I have used or tested.

Todo empezó con solo HTML, CSS y un poco de JavaScript.
Photo by Nangialai Stoman on Unsplash

TL;DR

  • Base64 es una codificación, no un cifrado ni una compresión. Reescribe bytes arbitrarios usando solo 64 caracteres ASCII imprimibles para que los datos binarios puedan viajar por canales de solo texto.
  • La mecánica: cada 3 bytes se convierten en 4 caracteres (6 bits cada uno), rellenados con =, razón por la cual la salida es aproximadamente +33% más grande que la entrada (RFC 4648, MDN).
  • Usos reales: data URIs (imágenes inline en CSS/HTML), adjuntos MIME en correos, binarios dentro de JSON/XML, encabezados HTTP Basic auth y segmentos JWT (que usan Base64URL).
  • Las trampas: Base64 es completamente reversible (nunca es una capa de seguridad), el impuesto del +33% lo hace incorrecto para archivos grandes en la red, y btoa() falla con caracteres que no son ASCII porque maneja Latin-1, no UTF-8.
  • Puedes codificar/decodificar ambas variantes en la herramienta AnyTools Base64; se ejecuta en tu navegador y nada sale de tu dispositivo.

Lo ves por todas partes, ¿pero qué es exactamente?

Ves una larga cadena de letras, números y un par de signos = al final (en un JWT, un archivo de configuración, una URL con data:, un encabezado de autenticación copiado) y tu cerebro automáticamente piensa: "Ah, Base64". Pero, ¿para qué sirve realmente y por qué está en todas partes?

Respuesta corta: Base64 reescribe datos binarios arbitrarios usando solo 64 caracteres ASCII seguros e imprimibles, para que los bytes puedan viajar a través de canales que solo aceptan texto sin corromperse. No es un código secreto. No es un compresor. Es un disfraz de transporte. Esta guía es la versión de desarrollador a desarrollador: la mecánica exacta, dónde brilla y dónde la gente la usa mal.

¿Qué hace realmente Base64?

Base64 está definido por el RFC 4648. Su alfabeto consta de 64 caracteres: A–Z, a–z, 0–9, además de + y /. Un carácter 65, =, se usa únicamente para relleno.

La transformación es puramente mecánica. Según el RFC 4648 §4, el codificador toma la entrada en grupos de 24 bits (3 bytes × 8 bits) y emite 4 caracteres, cada uno representando 6 bits. Esa proporción de 3 a 4 es toda la historia, y tiene una consecuencia inevitable que MDN deja claro: la forma codificada es aproximadamente un tercio más grande que la original; alrededor de un +33%, la famosa relación 4/3. Si la longitud de tu entrada no es un múltiplo exacto de 3, el último grupo se rellena para que la salida sea un múltiplo de 4. Por eso algunas cadenas terminan en uno o dos =.

Un ejemplo práctico, que puedes reproducir en la herramienta Base64:

"Hi"  → 2 bytes → "SGk="   (le falta un byte para completar el grupo → un "=")
"Hello, World!" → 13 bytes → "SGVsbG8sIFdvcmxkIQ=="

De esta mecánica se derivan dos cosas que son más importantes que las matemáticas:

  • Es completamente reversible y sin clave. Decodificar es simplemente usar la misma tabla al revés. No hay ningún secreto involucrado, lo cual es el origen del mayor mito que veremos más abajo.
  • Te cuesta tamaño, no seguridad. Pagas un ~33% para ganar seguridad en el texto: genial para un token de 200 bytes, un desastre para un archivo de 10 MB.

También hay una variante que vale la pena conocer: Base64URL (RFC 4648 §5). Misma codificación, pero cambia + por - y / por _, y generalmente elimina el relleno =, para que el resultado sea seguro dentro de URLs, nombres de archivo y segmentos JWT.

¿Dónde brilla realmente Base64?

Cada uso legítimo de Base64 tiene la misma forma: datos binarios que necesitan vivir dentro de algo que solo acepta texto. Aquí es donde eso pasa en la práctica.

  • Data URIs. Pones un pequeño icono directamente en CSS o HTML: background: url("data:image/svg+xml;base64,PHN2Zy…"). Los bytes de la imagen se convierten en parte del texto de la hoja de estilos, ahorrando una petición HTTP; solo vale la pena para recursos menores de ~1–2 KB, porque el impuesto del +33% viaja en cada página que cargue ese CSS.
  • Adjuntos de correo (MIME). Esta es la razón por la que existe Base64. El transporte de correo electrónico se construyó para texto de 7 bits, así que los archivos binarios se envuelven en Base64 para llegar intactos.
  • Binarios dentro de JSON / XML. JSON no tiene un tipo binario nativo. Para poner un pequeño blob (una miniatura, una firma, un certificado) en un campo JSON, lo pasas por Base64 para obtener una cadena que el parser pueda manejar.
  • HTTP Basic auth. El encabezado Authorization: Basic … es literalmente usuario:contraseña codificado en Base64. Ten en cuenta que digo codificado: la autenticación Basic ofrece cero confidencialidad por sí misma y depende enteramente de HTTPS. El Base64 aquí es solo formato, no protección.
  • Segmentos JWT. Un JSON Web Token es header.payload.signature, y cada parte es JSON codificado en Base64URL. Puedes pegar el segmento del medio en un decodificador y leer cada claim, por lo que jamás debes poner secretos en el payload de un JWT.

Para los casos ligados a URLs, Base64 a menudo se junta con una codificación diferente. Si estás ensamblando a mano una URL que ya lleva un valor en Base64, los caracteres +, / y = todavía necesitan adaptarse para ser seguros: usa Base64URL desde el principio, o pasa la URL por codificación porcentual (%-encoding) para que esos caracteres sobrevivan en la cadena de consulta. Y cuando necesites un identificador de texto único en lugar de bytes codificados, un generador de UUID es la herramienta correcta; los UUID son identificadores, no una forma de codificar datos.

¿Cuándo NO deberías usar Base64?

Esta es la sección decisiva. Base64 se usa en exceso de tres maneras, y cada una es un error esperando a pasar.

1. Es codificación, no cifrado, así que nunca lo uses para seguridad. Este es el pecado capital. Base64 no tiene clave; es reversible por cualquier persona en un solo paso. Una contraseña, una clave de API o un token "guardados como Base64" están guardados en texto plano; la codificación solo cambia qué caracteres se muestran, como señala MDN. Si necesitas confidencialidad, encripta. Si necesitas guardar credenciales, hashealos con bcrypt, scrypt o argon2.

2. Es la herramienta incorrecta para archivos grandes en la red. Debido al costo fijo de +33% en el tamaño, poner una imagen grande en Base64 dentro de tu código o enviar un archivo de varios megabytes como una cadena JSON desperdicia ancho de banda y obliga a que todo se decodifique en memoria de golpe. Para cualquier cosa más allá de recursos pequeños, envía el binario de forma nativa (una subida real vía multipart/form-data, o un cuerpo HTTP binario) y referéncialo por URL. Las data URIs inline son para recursos del tamaño de un favicon, no para la imagen principal de tu sitio.

3. No es compresión. Base64 hace que los datos sean más grandes, nunca más pequeños. Para reducir el tamaño de un payload, lo que quieres es gzip/brotli. A veces la gente codifica un blob en Base64 "para hacerlo portátil" y sin querer lo infla.

Aquí tienes una tabla de decisión rápida.

Situación¿Usar Base64?Por qué
Icono incrustado en CSS/HTML, menor a ~1–2 KB✅ SíAhorra una petición HTTP; el +33% es insignificante a ese tamaño
Recurso mayor a unos pocos KB🚫 NoUn +33% incrustado en cada página supera el ahorro de la petición; usa una solicitud de archivo normal
Blob binario en un campo JSON/XML✅ SíJSON no tiene tipo binario; el texto es la única opción
Valor que irá en una URL o JWT✅ Sí — Base64URL+ / = no son seguros en URLs; el alfabeto URL-safe lo soluciona
Guardar una contraseña o API key🚫 NoEs reversible; eso es texto plano. Hashea o encripta en su lugar
Enviar una imagen de 5 MB a un servidor🚫 NoImpuesto del +33%; usa una subida binaria real y una URL
Intentar reducir el tamaño de un payload🚫 NoBase64 aumenta los datos; usa gzip/brotli

Y una referencia rápida sobre las codificaciones que suelen confundirse entre sí:

CodificaciónAlfabeto / formaDiseñada para
Base64A–Z a–z 0–9 + /, relleno =Binario → texto ASCII (correo, JSON, data URIs)
Base64URL+-, /_, sin rellenoBinario → texto seguro en URLs / nombres de archivo / JWT
Codificación URL (%-encoding)%XX para caracteres insegurosHacer que el texto sea seguro dentro de una URL; es un problema diferente
Hex0–9 a–f, 2 caracteres/byteBytes legibles por humanos; +100% de tamaño, más simple que Base64

¿Cómo codificar y decodificar correctamente?

Puedes hacer esto en tu navegador sin instalar nada.

  1. Abre la herramienta AnyTools Base64. Se ejecuta completamente del lado del cliente; tu entrada nunca sale de tu dispositivo.
  2. Codificar: pega texto o bytes, obtén la cadena Base64. Activa la opción URL-safe si el valor irá a una URL, nombre de archivo o JWT; obtendrás -/_ y sin relleno =.
  3. Decodificar: pega una cadena Base64 (o Base64URL) para recuperar el original. La herramienta detecta automáticamente la variante, así que no necesitas saber cuál te dieron.
  4. Caracteres que no son ASCII funcionan sin problemas. La herramienta codifica en UTF-8 primero, así que emojis, letras acentuadas del español y árabe viajan perfectamente; nada de esos errores InvalidCharacterError de btoa() que aparecerían al usar 世界 o 🌏.

Si en cambio estás haciendo esto en tu código, ten en cuenta que las funciones nativas del navegador btoa()/atob() manejan Latin-1, no UTF-8, así que debes envolverlas con TextEncoder/TextDecoder para cualquier cosa fuera del ASCII básico, según MDN.

El veredicto honesto

Base64 es una de las herramientas más útiles y aburridas en el stack de un desarrollador, y casi todos sus problemas surgen al olvidar qué es en realidad. Es una codificación de transporte: convierte bytes arbitrarios en 64 caracteres ASCII seguros con un costo fijo de +33% de tamaño, lo que permite que los binarios viajen por canales de solo texto como correos, JSON, URLs y encabezados. Úsalo para data URIs, MIME, blobs en JSON, Basic auth y JWT (su variante URL-safe). No lo uses como medida de seguridad (no tiene clave y es reversible), para archivos grandes en la red (el impuesto de tamaño te pasará factura) ni como compresión (hace que los datos crezcan, no que se encojan).

Guarda esta frase en tu mente: es una codificación de transporte, no una bóveda de seguridad ni un archivo zip, y lo usarás correctamente siempre. Acude a la herramienta Base64 cuando necesites leer un claim de un JWT, incrustar un icono de menos de 2 KB o revisar un valor codificado; y opta por una subida binaria real (multipart/form-data) en el momento en que tu archivo pese más de unos pocos KB. Se ejecuta en tu navegador, soporta ambas variantes, y el texto que pegues jamás se envía a ningún servidor.

Divulgación: este artículo puede contener enlaces de afiliados; anytools puede ganar una comisión sin costo alguno para ti.

Sources

  1. IETF: RFC 4648 — The Base16, Base32, and Base64 Data Encodings
  2. IETF: RFC 4648 §5 — Base64 URL- and filename-safe alphabet
  3. MDN: Base64 (Glossary) — encoding, 6 bits per digit, ~33% size increase
  4. MDN: Window.btoa() — Base64 encoding in the browser
  5. MDN: Window.atob() — Base64 decoding in the browser
  6. IETF: RFC 7519 — JSON Web Token (JWT), Base64URL-encoded segments

Sigue leyendo


“Talk is cheap. Show me the code.”
― Linus Torvalds

design

Hoja de referencia de sintaxis cron (2026): Lee y crea cualquier expresión de crontab

La sintaxis de cron explicada: el orden de los 5 campos, un modelo para leerlo en 10 segundos, 16 recetas verificadas, la trampa del OR en los días, problemas con el horario de verano y cron vs systemd timers.

10 min read

herramienta para desarrollador regex tester y pattern builder — ilustración original

design

Regex Tester & Pattern Builder: Una guía práctica para crear patrones que sí funcionan

Cómo construir expresiones regulares que realmente funcionan: anclas, cuantificadores, las trampas entre motores y el patrón ReDoS que puede colgar tu servidor. Prueba mientras avanzas.

9 min read

Laptop con código y una planta en una cafetería

design

JSON vs YAML vs TOML: Cuándo elegir cada uno (guía para desarrolladores)

JSON vs YAML vs TOML, decidido: JSON para APIs y datos, YAML para configuración de Kubernetes/CI (cuidado con el problema de Noruega), TOML para configuración explícita de apps como Cargo.toml. Una guía clara de decisión.

9 min read

Un código QR escaneable sobre un fondo verde, ilustrando el diseño de un código QR con marca personalizada

design

Códigos QR con marca personalizada: Agrega un logo y colores con un generador gratuito

Cómo la corrección de errores te permite superponer un logo en un código QR, las reglas de contraste y zona de silencio que lo mantienen escaneable, y el verdadero precio de los QR estáticos vs. dinámicos.

8 min read

Tarjetas de muestras de color Swatchos con valores CMYK, RGB y hexadecimales siendo usadas por un diseñador gráfico en su escritorio

design

De HEX a RGB y CMYK en 2026: por qué el color de impresión nunca coincide con la pantalla

Convertir de HEX a RGB es pura matemática exacta. Pero pasar de RGB a CMYK es una aproximación que depende de la imprenta, el papel y el perfil ICC. Aquí te explico la diferencia, las fórmulas y dónde te sirve de verdad un conversor online.

8 min read

Primer plano de la hoja de pegatinas de Google Material design en un MacBook.

design

Herramientas de paleta de colores para accesibilidad: por qué la mayoría de las paletas fallan antes de su lanzamiento

El 83.6% de las páginas de inicio fallan en contraste. Cómo elegir herramientas que verifiquen paletas accesibles, evitar errores comunes y probar las combinaciones correctas.

9 min read