Para qué sirve
Base64 es una forma de escribir cualquier secuencia de bytes usando solo 64 caracteres imprimibles: letras, dígitos y dos signos. Existe porque hay muchos canales que se diseñaron para transportar texto y no bytes arbitrarios —el correo electrónico, una cabecera HTTP, un campo de un JSON, un atributo de HTML—, y meter ahí un byte cualquiera los rompe. Codificar en Base64 es el peaje que se paga para que unos bytes pasen por un sitio pensado para letras.
Esta herramienta hace las dos direcciones: convierte texto a Base64 y devuelve a texto una cadena Base64. Trabaja con UTF-8 de verdad, así que las eñes, los acentos, el euro y los emojis se codifican bien; admite la variante URL-safe; ignora los saltos de línea al decodificar; y con el botón de intercambiar puedes pasar el resultado a la entrada y comprobar que el viaje de ida y vuelta devuelve exactamente lo que había.
Lo que Base64 no hace, y conviene decirlo pronto: no cifra, no protege y no oculta nada. Es una transformación pública que revierte cualquiera —esta misma página, sin ir más lejos—. Tampoco sirve aquí para archivos: la herramienta va de texto a texto, así que el Base64 de una imagen dará error al decodificarlo porque esos bytes no forman texto.
Cómo se calcula
Base64 toma los bytes de tres en tres. Tres bytes son 24 bits, y esos 24 bits se reparten en cuatro trozos de 6. Con 6 bits hay exactamente 64 combinaciones posibles, y a cada una le corresponde un carácter del alfabeto: A-Z, a-z, 0-9 y dos signos más. Por eso el resultado solo contiene ASCII imprimible y sobrevive a cualquier canal de texto.
Cuando la longitud no es múltiplo de tres, el último grupo queda cojo: se completa con ceros y se añaden uno o dos signos «=» para indicar cuántos bytes eran de relleno. Esa es la única función del «=», y de ahí que la variante URL-safe pueda prescindir de él: la propia longitud de la cadena basta para deducir el relleno al decodificar.
Antes de todo eso hay un paso que se olvida a menudo: convertir el texto en bytes. Un texto no es una secuencia de bytes hasta que eliges una codificación, y aquí se usa UTF-8. La herramienta lo hace con TextEncoder, de modo que la «ñ» entra como dos bytes (C3 B1) y un emoji como cuatro. Al decodificar se recorre el camino inverso con TextDecoder en modo estricto: si los bytes no forman UTF-8 válido, se avisa en lugar de devolver una ristra de símbolos rotos.
3 bytes (24 bits) → 4 caracteres (4 × 6 bits)La relación 4/3 = 1,3333 es la razón de que la cadena resultante ocupe un 33,33 % más que el original.
caracteres = ⌈bytes / 3⌉ × 4- bytes
- tamaño del texto en UTF-8
- ⌈ ⌉
- redondeo hacia arriba
Bytes, no caracteres: la «ñ» cuenta como dos. La fórmula es con relleno «=»; en variante URL-safe la longitud es ⌈bytes × 4 / 3⌉, uno o dos caracteres menos.
Ejemplo resuelto
La cabecera de una autenticación Basic de HTTP
- Texto
- usuario:contraseña
- Longitud
- 18 caracteres, 19 bytes en UTF-8
- Variante
- Alfabeto estándar, con relleno
- El texto se pasa a bytes UTF-8: salen 19, no 18, porque la «ñ» ocupa dos (C3 B1).
- Los 19 bytes se agrupan de tres en tres: seis grupos completos y uno final con un solo byte.
- Cada grupo completo se parte en cuatro trozos de 6 bits y produce cuatro caracteres: 6 × 4 = 24 caracteres.
- El grupo final, con un byte suelto, da dos caracteres y se completa con «==» hasta cuatro. Total: 28 caracteres.
- En variante URL-safe se quitarían los dos «=» y quedaría en 26. Esta cadena no contiene ningún «+» ni ninguna «/», así que el resto no cambiaría.
dXN1YXJpbzpjb250cmFzZcOxYQ== — 28 caracteres para 19 bytes de texto, un 47 % más (en cadenas cortas el relleno pesa mucho). Y cualquiera que vea esa cabecera recupera la contraseña en un segundo: lo que protege una autenticación Basic es HTTPS, no el Base64.
Base64 no es cifrado, y confundirlo sale caro
Codificar y cifrar se parecen en que las dos cosas producen algo ilegible a simple vista, y ahí termina el parecido. Base64 no tiene clave: la transformación está publicada en un RFC, es reversible y la deshace cualquiera con dos clics. Una contraseña guardada «en Base64» en un fichero de configuración, en una cookie o en una columna de la base de datos está en claro, solo que con un paso de despiste.
El malentendido tiene versiones muy extendidas. La autenticación Basic de HTTP manda usuario y contraseña en Base64 en la cabecera Authorization, y lo que protege esa credencial es el TLS del canal, no la codificación. Los JWT llevan cabecera y contenido en Base64URL, legibles por quien los intercepte; lo que impide falsificarlos es la firma. En ninguno de los dos casos el Base64 aporta un gramo de confidencialidad.
| Criterio | Codificar (Base64) | Cifrar (AES) | Hashear (SHA-256) |
|---|---|---|---|
| ¿Necesita clave? | No | Sí | No |
| ¿Se puede revertir? | Sí, cualquiera | Sí, solo con la clave | No |
| ¿Para qué sirve? | Transportar bytes por un canal de texto | Ocultar el contenido | Comprobar integridad o guardar contraseñas |
| Tamaño del resultado | Un 33 % más | Parecido al original | Fijo, 32 bytes |
Las dos variantes del alfabeto
Los 62 primeros caracteres (A-Z, a-z, 0-9) son idénticos en las dos variantes. La diferencia está en los dos últimos y en el relleno, y no es un capricho: «+» y «/» ya significan algo dentro de una URL. En una cadena de consulta el «+» se interpreta como un espacio, y la «/» separa segmentos de ruta, así que un Base64 estándar metido en una URL llega cambiado o directamente roto.
Por eso el RFC 4648 define en su sección 5 una variante con «-» y «_», que además suele escribirse sin relleno porque el «=» también se convierte en «%3D» al pasar por una URL. Es la que usan los JWT, los cursores de paginación de muchas API y cualquier valor que acabe formando parte de una dirección o de un nombre de fichero. Al decodificar no hace falta saber cuál te han dado: los dos alfabetos son inequívocos y esta herramienta acepta los dos.
| Elemento | Estándar (§4) | URL-safe (§5) |
|---|---|---|
| Carácter 62 | + | - |
| Carácter 63 | / | _ |
| Relleno «=» | Se escribe siempre | Se omite casi siempre |
| Dónde se usa | Correo (MIME), data URI, HTTP Basic | URL, nombres de fichero, JWT |
Preguntas frecuentes
¿Sirve Base64 para proteger una contraseña o una clave de API?
No, y es el error más frecuente que se comete con esta codificación. Base64 no usa ninguna clave: es una transformación pública que revierte cualquiera en un segundo, incluida esta página. Si necesitas que un dato no se pueda leer, hace falta cifrado de verdad (AES-GCM, por ejemplo); si lo que guardas son contraseñas, una función de hash lenta y con sal como Argon2 o bcrypt.
¿Por qué el resultado ocupa un 33 % más?
Porque cada carácter Base64 transporta 6 bits pero se escribe en un byte de 8: se desperdicia una cuarta parte del espacio. Hacen falta 4 caracteres por cada 3 bytes, y 4/3 son 1,3333. En cadenas cortas el porcentaje sube algo más por el relleno del último grupo. Si el tamaño importa, comprime antes de codificar: gzip y luego Base64 suele salir bastante más pequeño que el original sin tocar.
¿Por qué btoa() se atraganta con la «ñ» y aquí no?
btoa() no recibe bytes, recibe una cadena en la que cada carácter tiene que valer 255 como mucho, es decir, Latin-1. Con la «ñ» (U+00F1, que sí cabe en un byte) no lanza error pero devuelve la respuesta equivocada: da «8Q==», el Base64 del byte F1, cuando el Base64 UTF-8 de la eñe es «w7E=» (bytes C3 B1). Con el «€» o con un emoji, que están por encima de 255, lanza directamente InvalidCharacterError. La solución es la que usa esta herramienta: convertir el texto a bytes con TextEncoder y codificar esos bytes.
¿Cuándo tengo que usar la variante URL-safe?
Siempre que la cadena vaya a acabar en una URL, en un nombre de fichero o en un JWT. En una cadena de consulta el «+» se lee como un espacio y la «/» se confunde con un separador de ruta, así que el valor no llega intacto. Si el destino es un correo, un data URI o una cabecera HTTP, usa la estándar. Decodificar da igual: las dos se reconocen solas.
¿Puedo codificar una imagen o un PDF aquí?
No. Esta herramienta va de texto a Base64 y de Base64 a texto; no se sube ningún archivo ni se leen sus bytes. Al revés tampoco: si pegas el Base64 de un PNG, la cadena es válida pero los bytes que salen no son texto UTF-8, y verás exactamente ese mensaje de error. Para archivos, «base64 fichero.png» en la terminal o «certutil -encode» en Windows hacen el trabajo.
Me dice que la cadena no es válida, ¿qué reviso?
Por este orden: que no falte ningún trozo al copiar (Base64 avanza de cuatro en cuatro y nunca puede quedar un carácter suelto); que no arrastres el prefijo «data:image/png;base64,» de un data URI, que hay que quitar a mano; que el «=» esté solo al final; y que lo que tienes sea realmente Base64 y no hexadecimal o una cadena con «%20», que es URL-encoding y se deshace de otra forma. Los espacios y los saltos de línea no molestan: se ignoran antes de decodificar.
¿Se envía a algún servidor lo que escribo?
No. Todo el proceso ocurre en tu navegador y ni el texto ni el resultado salen de tu equipo. Aun así, evita por costumbre pegar credenciales reales en herramientas online, aquí o en cualquier otra: la que uses mañana quizá no funcione igual.
Ten en cuenta
Fuentes
Toda la información de esta página se refiere a: Codificador y decodificador Base64.