¿Qué es Base64?
Base64 es un esquema de codificación que representa datos binarios como una secuencia de caracteres ASCII imprimibles. Toma cualquier secuencia de bytes — ya sea una imagen, un PDF o datos binarios sin procesar — y los codifica en una cadena compuesta únicamente por 64 caracteres seguros: A–Z, a–z, 0–9, + y / (con = para el relleno).
El nombre "Base64" proviene del hecho de que la codificación utiliza un sistema numérico de base 64.
Los 64 caracteres
| Grupo | Caracteres |
|---|---|
| Mayúsculas | A–Z (26) |
| Minúsculas | a–z (26) |
| Dígitos | 0–9 (10) |
| Símbolos | +, / (2) |
| Relleno | = |
También existen variantes seguras para URL que reemplazan + por - y / por _, evitando conflictos con caracteres especiales de URL.
Cómo Funciona la Codificación Base64
Base64 funciona convirtiendo cada 3 bytes de datos binarios en 4 caracteres Base64.
- Tomar 3 bytes (24 bits) de la entrada
- Dividir en cuatro grupos de 6 bits
- Mapear cada valor de 6 bits a un carácter del alfabeto Base64
Ejemplo: Codificación de la cadena "Man"
| Carácter | M | a | n |
|---|---|---|---|
| ASCII | 77 | 97 | 110 |
| Binario | 01001101 | 01100001 | 01101110 |
Combinado: 010011010110000101101110
Dividido en grupos de 6 bits: 010011 | 010110 | 000101 | 101110
Mapeado: T | W | F | u → "TWFu"
Si la entrada no es un múltiplo de 3 bytes, se usa relleno con caracteres = para completar el último grupo.
Sobrecarga de Tamaño
La codificación Base64 aumenta el tamaño de los datos en aproximadamente un 33% (cada 3 bytes se convierten en 4 caracteres). Ten esto en cuenta al decidir usar Base64 para datos grandes.
Breve Historia
Base64 fue desarrollado en el contexto de MIME (Extensiones de Correo de Internet Multipropósito), estandarizado en 1992 por la RFC 1341. Los sistemas de correo electrónico fueron diseñados originalmente para transmitir solo texto ASCII de 7 bits, pero los archivos adjuntos como imágenes y documentos son datos binarios. Base64 resolvió esto codificando los datos binarios como texto plano que podía transitar de forma segura por la infraestructura de correo electrónico.
El nombre y el concepto aparecieron incluso antes en el uuencode de Unix (un esquema diferente pero relacionado), pero el Base64 de MIME se convirtió en el estándar duradero.
Casos de Uso Comunes
1. Incrustar Imágenes en HTML/CSS
En lugar de referenciar un archivo de imagen externo, puedes incrustar una imagen directamente usando una URI de datos codificada en Base64:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />
Cuándo usar: Iconos pequeños o imágenes que ahorran solicitudes HTTP en la ruta de renderizado crítica.
Cuándo evitar: Imágenes grandes — la sobrecarga del 33% más la incapacidad de cachear la imagen por separado superan los beneficios.
2. Autenticación HTTP Básica
La autenticación HTTP Basic envía las credenciales como una cadena codificada en Base64 en el encabezado Authorization:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Esto es username:password codificado en Base64. Importante: Esto NO es cifrado — es trivialmente decodificable. Siempre usa HTTPS con la autenticación básica.
3. JWT (JSON Web Tokens)
Los tokens JWT están compuestos por tres secciones codificadas en Base64URL separadas por puntos: encabezado, payload y firma. El encabezado y el payload son legibles (no están cifrados) — Base64 aquí es puramente para la codificación de transporte.
4. Archivos Adjuntos de Correo Electrónico (MIME)
Como el caso de uso original de Base64: los clientes de correo electrónico codifican los archivos adjuntos binarios (imágenes, PDFs, etc.) en Base64 para transmitirlos de forma segura a través de la infraestructura de correo.
5. Almacenar Datos Binarios en JSON o XML
Dado que JSON y XML solo soportan texto, los datos binarios (como claves de cifrado o imágenes pequeñas) a menudo se codifican en Base64 antes de incluirlos.
6. URLs de Datos en CSS
Las imágenes de fondo pueden ser inlineadas en CSS:
background-image: url('data:image/svg+xml;base64,PHN2ZyB4...');
Variantes de Base64
| Variante | Caracteres | Caso de Uso |
|---|---|---|
| Base64 Estándar | A–Z a–z 0–9 + / | Propósito general |
| Base64 Seguro para URL | A–Z a–z 0–9 - _ | URLs, nombres de archivo, JWTs |
| Base64 sin relleno | Omite = | Algunas APIs lo prefieren |
| MIME Base64 | Estándar + saltos de línea cada 76 chars | Correo electrónico |
Consideraciones de Seguridad
Base64 NO es Cifrado
Este es el punto más crítico: Base64 es una codificación, no un cifrado. Cualquier persona que tenga la cadena Base64 puede decodificarla instantáneamente — no se requiere ninguna clave. Nunca uses Base64 para "ocultar" información sensible.
echo "dXNlcm5hbWU6cGFzc3dvcmQ=" | base64 --decode
# Salida: username:password
No Codifiques Contraseñas en Base64
Almacenar contraseñas como Base64 ofrece seguridad cero. Usa algoritmos de hash de contraseñas adecuados como bcrypt, Argon2 o scrypt en su lugar.
Riesgos XSS con URIs de Datos
Si bien las URIs de datos Base64 en sí son seguras, el JavaScript malicioso puede codificarse y ejecutarse a través de URIs data:text/html;base64,... en algunos contextos del navegador. La mayoría de los navegadores modernos restringen esto para la navegación de enlaces y las fuentes de iframe, pero siempre sanea las URIs de datos proporcionadas por el usuario.
Base64 en Lenguajes de Programación
JavaScript
// Codificar
const encoded = btoa("Hello, World!"); // "SGVsbG8sIFdvcmxkIQ=="
// Decodificar
const decoded = atob("SGVsbG8sIFdvcmxkIQ=="); // "Hello, World!"
Nota: btoa/atob solo funcionan con cadenas Latin-1 en navegadores. Para Unicode:
// Codificación segura para Unicode
const encoded = btoa(unescape(encodeURIComponent("こんにちは")));
O usa Buffer en Node.js:
Buffer.from("Hello").toString("base64");
Buffer.from("SGVsbG8=", "base64").toString("utf8");
Python
import base64
# Codificar
encoded = base64.b64encode(b"Hello, World!").decode("utf-8")
# "SGVsbG8sIFdvcmxkIQ=="
# Decodificar
decoded = base64.b64decode("SGVsbG8sIFdvcmxkIQ==").decode("utf-8")
# "Hello, World!"
# Variante segura para URL
url_safe = base64.urlsafe_b64encode(b"Hello+World/")
Consideraciones de Rendimiento
- La codificación/decodificación es rápida: Para la mayoría de los casos de uso, la sobrecarga de Base64 es insignificante.
- Sobrecarga de tamaño: ~33% más grande que el binario. Evitar para archivos grandes (MB+) transmitidos frecuentemente.
- Presión en la caché de CPU: Codificar archivos binarios grandes en memoria puede ejercer presión sobre la caché de CPU.
Para transferencias binarias grandes, prefiere los protocolos binarios (HTTP/2 con encuadre binario, marcos binarios de WebSocket, gRPC con protobuf) sobre Base64.
Resumen
Base64 es una de esas tecnologías fundamentales que sustentan gran parte de la web moderna sin que la mayoría de los desarrolladores piensen en ello. Resuelve bien un problema específico: codificar de forma segura datos binarios como texto imprimible para su transmisión en sistemas basados en texto.
Usa Base64 cuando: Necesites incrustar datos binarios en contextos de texto (HTML, JSON, correo electrónico, encabezados).
No uses Base64 cuando: Quieras cifrar o proteger datos — Base64 es completamente reversible sin ninguna clave.