Base64 convierte bytes cualesquiera en una cadena de 64 caracteres seguros, de modo que datos que nunca fueron pensados como texto puedan atravesar canales que solo aceptan texto. Se diseñó para los adjuntos de correo en los años noventa y sigue estando en todas partes: URIs de datos, JWT, cabeceras de autenticación HTTP Basic, payloads JSON que transportan blobs binarios.
Qué hace realmente la codificación
El codificador lee la entrada de tres en tres bytes. Tres bytes son 24 bits, que recorta en cuatro grupos de seis bits. Seis bits admiten 64 valores, y cada uno de esos valores corresponde a un carácter del alfabeto A–Z, a–z, 0–9, más "+" y "/". Todo el truco está ahí.
Cuando la longitud de la entrada no es múltiplo de tres, el último grupo queda corto y el codificador rellena la salida con uno o dos caracteres "=", para que el resultado siempre sea divisible entre cuatro. Por eso algunas cadenas terminan en signos de igual y otras no: te indica la longitud original módulo 3, nada más.
El 33% que pagas por ello
Cuatro caracteres de salida por cada tres bytes de entrada significa que la salida Base64 es un 33% más grande que la entrada. Una imagen de 900 KB se convierte en unos 1,2 MB de texto. Esto pesa sobre todo allí donde más se recurre a Base64: incrustar imágenes como URIs de datos en CSS o HTML.
Incrustar ahorra una petición HTTP, algo que valía mucho con HTTP/1.1 y vale bastante menos con HTTP/2 y HTTP/3, donde las peticiones van multiplexadas. El coste, en cambio, es real: una imagen incrustada no puede cachearse por separado del documento, así que cada cambio en la página la vuelve a descargar, y cada visita la descarga junto con el HTML. Como regla práctica: incrustar es defendible para recursos diminutos —un icono de unos cientos de bytes— y un error para fotografías.
Base64 no es cifrado
Es con diferencia el malentendido más común, y provoca incidentes reales. Base64 no tiene clave. Cualquiera que tenga la cadena la descodifica en un paso, incluido el navegador desde el que lees esto. Codificar una contraseña, un token de API o la ficha de un cliente en Base64 no protege nada: solo hace el valor ilegible para un humano que ojea un registro, y eso no es una propiedad de seguridad.
Un JWT lo hace concreto. Su cabecera y su payload son Base64url, no están cifrados: pega uno en un descodificador y leerás todos los claims que contiene. La firma impide *modificar* el token, no *leerlo*. Nunca pongas en el payload de un JWT algo que quien posee el token no deba ver.
La variante segura para URLs
El Base64 estándar usa "+" y "/", y en una URL ambos significan otra cosa: "+" puede leerse como espacio en una cadena de consulta, y "/" es un separador de ruta. La variante base64url definida en el RFC 4648 §5 los cambia por "-" y "_", y normalmente elimina el relleno. Si un token que estás descodificando contiene "-" o "_" y ningún "=", casi con seguridad estás viendo base64url, que es lo que usan los JWT.
Preguntas frecuentes
¿Se envían mis datos a un servidor?
No. Esta herramienta está marcada como "client": la codificación se ejecuta en la pestaña de tu navegador con su propio motor JavaScript, y lo que escribes nunca sale de la máquina. Cierras la pestaña y no queda nada. Dicho esto, si los datos son realmente sensibles, usa una herramienta que controle tu organización en lugar de cualquier página web gratuita, esta incluida.
¿Por qué mi texto descodificado muestra caracteres raros?
Casi siempre es un desajuste de codificación de caracteres. Base64 codifica bytes, no caracteres, así que no puede saber si esos bytes debían ser UTF-8, Latin-1 u otra cosa. Si el texto original era UTF-8 y se interpreta como Latin-1, las letras acentuadas se convierten en pares como "á". El paso de Base64 está bien; lo que falla es la interpretación posterior.
¿Por qué btoa() y atob() de JavaScript fallan con las letras acentuadas?
Porque son anteriores al soporte de Unicode y solo manejan caracteres en el rango 0–255. Pasar "á" a btoa() lanza un InvalidCharacterError. La solución moderna es convertir primero a bytes con TextEncoder y luego codificar esos bytes, que es justo lo que esta herramienta hace por ti.
¿Hay un límite de tamaño?
Ninguno impuesto por la herramienta, pero sí uno práctico impuesto por tu dispositivo. Todo ocurre en memoria, y la copia codificada es un tercio más grande que la entrada, así que los archivos muy grandes volverán lenta la pestaña antes de que algo falle del todo. Para binarios de varios megabytes, una herramienta de línea de comandos es el instrumento adecuado.