GarToolsPremium Tools
Desarrollo

Base64: qué es y cómo codificar y decodificar datos correctamente

Aprende qué es Base64, para qué se usa en desarrollo web, y cómo codificar y decodificar texto e imágenes fácilmente.

Por Ferran Garola Bonilla8 min de lectura
Imagen ilustrativa del artículo: Base64: qué es y cómo codificar y decodificar datos correctamente
Compartir

¿Qué es Base64?

Base64 es un sistema de codificación que convierte datos binarios en una representación de texto ASCII usando un alfabeto de 64 caracteres: letras mayúsculas (A-Z), minúsculas (a-z), dígitos (0-9), el signo más (+) y la barra (/). El carácter de relleno es el signo igual (=).

Es crucial entender que Base64 no es encriptación ni cifrado. No protege datos de ninguna forma — cualquiera puede decodificar un string en Base64 trivialmente. Su propósito es puramente funcional: transformar datos binarios en una representación textual que puede transmitirse de forma segura a través de protocolos diseñados para texto.

Base64 fue originalmente definido en RFC 1421 (1993) para el estándar PEM de correo electrónico, y posteriormente estandarizado en RFC 4648 (2006) que define las variantes Base64 y Base64url.

¿Cómo funciona internamente?

El proceso de codificación Base64 es elegante en su simplicidad:

  1. Toma los datos de entrada como una secuencia de bytes
  2. Agrupa los bytes en bloques de 3 (24 bits)
  3. Divide cada bloque de 24 bits en 4 grupos de 6 bits
  4. Cada grupo de 6 bits se mapea a uno de los 64 caracteres del alfabeto

Si la entrada no es múltiplo de 3 bytes, se añade padding con = al final.

Por ejemplo, la palabra "Hola":

  • H(72) o(111) l(108) → 4 caracteres Base64
  • a(97) + padding → 4 caracteres Base64 (con ==)
  • Resultado: SG9sYQ==

Este proceso siempre incrementa el tamaño de los datos en aproximadamente un 33% (4 bytes de salida por cada 3 de entrada).

¿Para qué se usa Base64 en la práctica?

Emails y MIME

El protocolo SMTP original solo transmite texto ASCII de 7 bits. Los archivos adjuntos (imágenes, PDFs, documentos) se codifican en Base64 para poder viajar como texto dentro del cuerpo del email. Esto es parte del estándar MIME (Multipurpose Internet Mail Extensions).

Data URIs en HTML/CSS

Puedes incrustar imágenes, fuentes e incluso scripts directamente en HTML o CSS usando Data URIs:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" />

Esto elimina una petición HTTP adicional, lo que puede ser ventajoso para iconos pequeños y assets críticos del above-the-fold.

Tokens y autenticación

Los JSON Web Tokens (JWT) codifican su header y payload en Base64url. Las cabeceras HTTP de autenticación Basic codifican el par usuario:contraseña en Base64 (Authorization: Basic dXN1YXJpbzpjbGF2ZQ==).

APIs y servicios web

Algunos servicios aceptan archivos como strings Base64 en cuerpos JSON, evitando la necesidad de multipart/form-data. Esto simplifica la integración pero incrementa el tamaño de la petición.

Almacenamiento en bases de datos

Cuando necesitas almacenar datos binarios pequeños en campos de texto de una base de datos (por ejemplo, avatares de usuario en formato blob), Base64 es una solución común aunque no óptima para datos grandes.

Codificar y decodificar en JavaScript

En el navegador

// Codificar texto simple (solo ASCII)
const encoded = btoa("Hello world");
// "SGVsbG8gd29ybGQ="

// Decodificar
const decoded = atob("SGVsbG8gd29ybGQ=");
// "Hello world"

El problema crítico de btoa es que no soporta caracteres Unicode directamente. Si intentas btoa("Olá") obtendrás un error. La solución robusta para texto con acentos, emojis o caracteres multibyte:

// Codificar con soporte UTF-8
function encodeUTF8Base64(str) {
  return btoa(
    encodeURIComponent(str).replace(
      /%([0-9A-F]{2})/g,
      (_, p1) => String.fromCharCode(parseInt(p1, 16))
    )
  );
}

// Decodificar con soporte UTF-8
function decodeUTF8Base64(b64) {
  return decodeURIComponent(
    Array.from(atob(b64))
      .map(c => "%" + c.charCodeAt(0).toString(16).padStart(2, "0"))
      .join("")
  );
}

En nuestro codificador Base64 puedes codificar y decodificar cualquier texto con soporte completo de UTF-8 sin preocuparte por estos detalles técnicos.

En Node.js

// Codificar
Buffer.from("Hola mundo", "utf-8").toString("base64");

// Decodificar
Buffer.from("SG9sYSBtdW5kbw==", "base64").toString("utf-8");

Imágenes en Base64

Convertir imágenes a Base64 es útil en varios escenarios:

  • Eliminar peticiones HTTP: para iconos pequeños (< 2KB), incrustarlos como Data URI puede ser más eficiente que una petición HTTP separada.
  • CSS sin assets externos: puedes incluir iconos directamente en tu hoja de estilos.
  • APIs que solo aceptan texto: algunos endpoints requieren que envíes imágenes como strings Base64 en JSON.
  • Previsualización antes de upload: en formularios web, puedes mostrar una preview de la imagen seleccionada usando FileReader y Data URI.

Usa nuestro conversor de imagen a Base64 para arrastrar cualquier imagen y obtener el Data URI listo para copiar y usar.

¿Cuándo NO usar Base64?

Base64 no es la solución correcta en estos casos:

  • Imágenes grandes (> 5KB): el incremento del 33% en tamaño y la imposibilidad de cachear independientemente hacen que servir el archivo directamente sea más eficiente.
  • Protección de datos sensibles: Base64 no es cifrado. Cualquiera puede decodificarlo instantáneamente.
  • Assets que se cachean: un archivo externo se cachea en el navegador y se reutiliza entre páginas. Un Data URI no.
  • SEO de imágenes: las imágenes en Data URI no aparecen en Google Images.
  • Datos grandes en APIs: para archivos grandes, usa multipart/form-data en lugar de Base64 en JSON.

Variantes de Base64

Existen varias variantes del estándar:

  • Base64 estándar (RFC 4648): usa +, / y = como padding
  • Base64url (RFC 4648 §5): usa - y _ en lugar de + y /, sin padding. Seguro para URLs y nombres de archivo. Usado en JWT.
  • Base32: usa 32 caracteres, más legible pero más largo. Usado en TOTP (Google Authenticator).

Base64 en la practica: casos reales

Autenticacion HTTP Basic

El esquema de autenticacion HTTP Basic codifica las credenciales (usuario:contraseña) en Base64 y las envia en la cabecera Authorization. Es importante entender que esto no proporciona seguridad por si solo: las credenciales viajan codificadas, no cifradas. Cualquiera que intercepte la peticion puede decodificar las credenciales instantaneamente. Por eso HTTP Basic solo debe usarse sobre conexiones HTTPS.

Fuentes web embebidas

De forma similar a las imagenes, las fuentes tipograficas pueden codificarse en Base64 e incrustarse directamente en CSS con la regla @font-face. Esto elimina peticiones HTTP adicionales y evita problemas de CORS al cargar fuentes desde otros dominios. Sin embargo, el coste es un CSS significativamente mas pesado y la imposibilidad de cachear la fuente independientemente.

Adjuntos en emails (MIME)

El protocolo SMTP solo soporta texto ASCII de 7 bits. Para adjuntar archivos binarios (imagenes, PDFs, documentos), los clientes de correo codifican el archivo en Base64 y lo incluyen en el cuerpo del mensaje con cabeceras MIME que indican el tipo de contenido y la codificacion. Este es uno de los usos mas antiguos y extendidos de Base64, presente desde los primeros dias del email.

Almacenamiento en bases de datos

Aunque no es la practica mas eficiente, algunos sistemas almacenan archivos pequeños (avatares, firmas, iconos) como strings Base64 en campos de texto de la base de datos. La ventaja es la simplicidad: no necesitas gestionar un sistema de archivos separado ni un servicio de almacenamiento. La desventaja es el incremento del 33% en tamaño, la imposibilidad de servir los archivos con cabeceras de cache adecuadas y el impacto en el rendimiento de consultas que devuelven grandes cantidades de datos binarios codificados.

Rendimiento y consideraciones de tamaño

El incremento del 33% en tamaño que produce Base64 merece una atencion especial. Para un icono de 1 KB, los 333 bytes adicionales son irrelevantes. Pero para una imagen de 1 MB, estamos hablando de 333 KB extra, y si esa imagen esta incrustada en un archivo CSS o HTML, el navegador no puede empezar a renderizar hasta que descargue y parsee todo el archivo.

La regla practica para imagenes en Data URI es simple: si la imagen pesa menos de 2 KB, probablemente merece la pena incrustarla. Entre 2 y 5 KB, depende del contexto (numero de imagenes, criticidad del tiempo de carga). Por encima de 5 KB, sirve el archivo directamente y deja que el navegador lo cachee.

Para APIs, el umbral es diferente porque no hay cache del navegador en juego. Aun asi, para archivos grandes (mas de 1 MB), multipart/form-data es mas eficiente que Base64 en JSON porque evita el overhead de codificacion y decodificacion y permite streaming del upload.

Herramientas para trabajar con Base64

Ademas del codificador de GarTools, existen herramientas de linea de comandos para trabajar con Base64 en scripts y automatizaciones. En Linux y macOS, el comando base64 esta disponible nativamente. En Windows, puedes usar certutil -encode o PowerShell con System.Convert. Estas herramientas son utiles para procesar archivos en batch, integrar codificacion en pipelines de CI/CD o depurar tokens JWT decodificando sus segmentos Base64url.

Para desarrollo web, las DevTools del navegador incluyen funciones de codificacion Base64 directamente en la consola. Puedes usar btoa() y atob() para codificar y decodificar strings rapido durante la depuracion sin necesidad de abrir una herramienta externa.

En entornos de produccion, ten en cuenta que btoa() y atob() del navegador solo manejan caracteres Latin1. Para codificar strings con caracteres Unicode (acentos, emojis, caracteres CJK), necesitas convertir primero a bytes con TextEncoder y luego codificar esos bytes. En Node.js, Buffer.from() maneja cualquier encoding correctamente sin pasos adicionales.

Conclusión

Base64 es una herramienta esencial en el kit de cualquier desarrollador web. Entender cuándo y cómo usarla (y cuándo no) te ahorrará problemas con APIs, emails, assets web y autenticación. Practica con nuestro codificador Base64 online — todo se procesa en tu navegador de forma privada e instantánea.

¿Te ha sido útil este artículo?

Suscríbete a la newsletter mensual: un correo cuando publicamos algo igual de útil. Sin spam.

¿Te ha gustado?
Compártelo con alguien a quien le pueda ser útil.

Los comentarios se activarán próximamente. ¿Quieres compartir algo sobre este artículo? Escríbenos en /contacto.

Continuar leyendo
Volver al blog