¿Qué es Base64?
Base64 es una forma de escribir cualquier dato binario (una imagen, un PDF, una clave de cifrado) usando solo 64 caracteres «seguros»: A–Z, a–z, 0–9, + y /, con = como relleno. Como el resultado es texto ASCII, puede viajar por sistemas pensados solo para texto: correo electrónico, JSON, XML, HTML, URL y cabeceras HTTP.
Base64 es una codificación, no un cifrado. Cualquiera puede decodificarlo, así que no protege secretos: solo hace que los datos sean transportables. El formato se define en la RFC 4648; el correo (MIME) usa el mismo alfabeto con un salto de línea cada 76 caracteres (RFC 2045).
Cómo funciona la codificación Base64
El codificador toma 3 bytes (24 bits) a la vez, los divide en cuatro grupos de 6 bits y asigna a cada grupo (0–63) un carácter del alfabeto. Este es el ejemplo de la palabra «Man»:
| Paso | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| Texto | M | a | n | |
| Valor del byte | 77 | 97 | 110 | |
| Bits (8 por byte) | 01001101 | 01100001 | 01101110 | |
| Bits (6 por carácter) | 010011 | 010110 | 000101 | 101110 |
| Índice (0–63) | 19 | 22 | 5 | 46 |
| Base64 | T | W | F | u |
Así, «Man» se convierte en TWFu. Si la longitud no es múltiplo de tres, el último grupo se completa con bits a cero y se añaden uno o dos =: «Ma» → TWE=, «M» → TQ==.
Variantes de Base64
| Variante | Caracteres / regla | Se usa en |
|---|---|---|
| Estándar (RFC 4648 §4) | A–Z a–z 0–9 + / y = | API JSON, XML, bases de datos, la mayoría de lenguajes |
| URL-safe (Base64URL, §5) | A–Z a–z 0–9 - _ normalmente sin = | Tokens JWT, URL, nombres de archivo, OAuth, WebAuthn |
| MIME (RFC 2045) | Estándar, máx. 76 caracteres por línea, CRLF | Adjuntos de correo (SMTP), S/MIME |
| PEM (RFC 7468) | Estándar, 64 caracteres por línea + líneas BEGIN/END | Certificados TLS, claves SSH y PGP |
| Data URI (RFC 2397) | data:[tipo];base64,[datos] | Imágenes y fuentes incrustadas en HTML, CSS, SVG y correos |
Usos habituales
- Incrustar imágenes en HTML, CSS o correos como Data URI para ahorrar una petición HTTP (ideal para iconos pequeños de menos de ~10 KB).
- Enviar archivos por API JSON o XML, por ejemplo un documento o una firma en una petición REST.
- Leer tokens JWT: la cabecera y el contenido son JSON codificado en Base64URL. Pega una parte aquí para leerla.
- Autenticación HTTP Basic: la cabecera
Authorizationcontieneusuario:contraseñaen Base64. - Certificados y claves (archivos PEM), secretos de Kubernetes y muchos valores de configuración se guardan en Base64.
¿Cuánto aumenta el tamaño con Base64?
La salida Base64 siempre es aproximadamente un 33 % mayor que la entrada: cada 3 bytes se convierten en 4 caracteres. La longitud exacta es 4 × ⌈n / 3⌉ caracteres (sin saltos de línea). Con los saltos de línea MIME es alrededor de un 37 %.
| Original | Base64 | Con saltos de línea MIME |
|---|---|---|
| 1 KB (1024 bytes) | 1368 caracteres | ≈ 1,4 KB |
| 100 KB | ≈ 133 KB | ≈ 137 KB |
| 1 MB | ≈ 1,33 MB | ≈ 1,37 MB |
| 10 MB | ≈ 13,3 MB | ≈ 13,7 MB |
¿Es seguro Base64?
No: Base64 no oculta nada. Nunca lo uses para «proteger» contraseñas o datos personales; usa cifrado real (por ejemplo AES o TLS). Lo que sí es seguro es esta herramienta: tus datos se codifican y decodifican localmente en tu navegador y nunca se suben, algo importante al trabajar con tokens, claves o archivos de clientes (RGPD).
Base64 en código
Consejo: en JavaScript, btoa() solo acepta Latin-1 y falla con emojis o «€»; convierte primero el texto a bytes UTF-8, como se muestra abajo.
| Lenguaje | Codificar | Decodificar |
|---|---|---|
| JavaScript | btoa(String.fromCharCode(...new TextEncoder().encode(s))) | new TextDecoder().decode(Uint8Array.from(atob(b), c => c.charCodeAt(0))) |
| Node.js | Buffer.from(s, 'utf8').toString('base64') | Buffer.from(b, 'base64').toString('utf8') |
| Python | base64.b64encode(s.encode()).decode() | base64.b64decode(b).decode() |
| PHP | base64_encode($s) | base64_decode($b, true) |
| Java | Base64.getEncoder().encodeToString(bytes) | Base64.getDecoder().decode(b) |
| C# | Convert.ToBase64String(bytes) | Convert.FromBase64String(b) |
| Go | base64.StdEncoding.EncodeToString(data) | base64.StdEncoding.DecodeString(b) |
| Linux / macOS | base64 -w 0 file.bin | base64 -d file.txt > file.bin |
| PowerShell | [Convert]::ToBase64String([IO.File]::ReadAllBytes("f.bin")) | [IO.File]::WriteAllBytes("f.bin", [Convert]::FromBase64String($b)) |
Consejos
- Teclado: Ctrl+Intro convierte, Ctrl+Mayús+Intro intercambia entrada y resultado, Ctrl+S descarga (⌘ en Mac).
- ¿Tildes ilegibles tras decodificar (p. ej. «Ã±» en lugar de «ñ»)? Los datos se crearon probablemente con otra codificación: elige Windows-1252 o ISO-8859-1 en el menú Codificación.
- JWT: pega solo la parte central (entre los dos puntos) y decodifica; el alfabeto URL-safe y la falta de relleno se detectan automáticamente.
- Capturas de pantalla: pulsa Ctrl+V en cualquier parte de la página para convertir una imagen copiada en Data URI.
- Las imágenes grandes hacen pesados el HTML y el CSS. A partir de unos pocos kilobytes, un archivo de imagen normal (comprimido con nuestro compresor de imágenes) carga más rápido.