ToolActToolAct

Codificador/Decodificador Base64

Codifica y decodifica rápidamente Base64 con soporte de texto UTF-8

Entrada
Caracteres: 0
Bytes: 0
Salida
Caracteres: 0
Bytes: 0

Selecciona Método de Conversión

¿Qué es Base64?

Base64 es un método que utiliza 64 caracteres imprimibles para representar datos binarios. Estos 64 caracteres incluyen mayúsculas A-Z, minúsculas a-z, dígitos 0-9, y los dos símbolos + y /. Como solo usa caracteres imprimibles, los datos codificados en Base64 pueden transmitirse de forma segura en entornos que solo soportan texto, como correos electrónicos, páginas web y JSON. Los datos codificados aumentan aproximadamente un 33% respecto a los originales. Base64 apareció por primera vez en 1987 en el protocolo PEM para transmitir datos binarios de forma segura en correos. Hoy es uno de los estándares de Internet, ampliamente utilizado en diversos escenarios, desde archivos adjuntos hasta tokens JWT, desde imágenes embebidas hasta transmisión de datos. Casi todos los lenguajes de programación tienen funciones de codificación y decodificación Base64 integradas.

Cómo usar

Cómo usar

  1. Pega tu texto en el cuadro de entrada izquierdo
  2. Selecciona la operación 'Codificar Base64' o 'Decodificar Base64'
  3. Los resultados aparecen automáticamente a la derecha
  4. Haz clic en el botón de copiar para guardar el resultado

Errores comunes

  • Base64 es codificación, no cifrado; cualquiera con el texto puede decodificarlo, así que no lo uses para proteger secretos.
  • Cuando la decodificación falle, revisa si falta el relleno, hay saltos de línea copiados, caracteres URL-safe de Base64 o comillas envolventes.

Casos de uso

Codificar texto Unicode para campos que solo aceptan Base64Pega texto con nombres, emojis, saltos de línea o caracteres CJK y la página lo codifica mediante TextEncoder antes de btoa, evitando el fallo clásico de Unicode en el navegador que corrompe la entrada no ASCII. La cadena de entrada nunca sale de la pestaña del navegador: la codificación se ejecuta por completo contra el TextEncoder en memoria y los caracteres resultantes permanecen en el DOM local hasta que los copies tú mismo.
Decodificar fragmentos de payload copiados durante la depuraciónCambia al modo decodificar para valores encontrados en logs, campos JSON, cabeceras, archivos de configuración o tickets de soporte. Un Base64 inválido devuelve un error claro en lugar de producir un resultado parcial engañoso. El paso de decodificación también ocurre localmente: atob más TextDecoder reensamblan los bytes en una cadena directamente dentro de la página, de modo que los bytes permanecen en la misma máquina que los generó.
Verificar una ida y vuelta antes de publicar ejemplosUsa el botón de intercambio tras codificar o decodificar para confirmar que la muestra vuelve al texto original. Esto resulta útil para documentación de API, ejemplos de webhooks, fragmentos de README y fixtures de prueba donde un carácter incorrecto rompe el ejemplo. Como todo se ejecuta en el cliente, la misma muestra puede verificarse repetidamente sin subir el payload a un decodificador de terceros.
Inspeccionar la cabecera o el segmento de claims de un JWTDecodifica un segmento de un JWT entre los puntos para leer la cabecera o el JSON de claims durante la depuración, dejando la verificación de firma a la biblioteca adecuada. La página no valida firmas, así que no la uses como comprobación de autenticación ni confíes en el contenido en rutas de producción. Los tokens decodificados aquí nunca salen del navegador, lo que importa al depurar tokens de producción que contienen claims internos.
Reconstruir un data: URI pequeño para activos en líneaCodifica un SVG pequeño, favicon o fragmento CSS en un data: URI y pégalo directamente en una hoja de estilos, README o plantilla de correo. Útil para vistas previas en línea donde no es posible subir el activo, pero ten en cuenta la sobrecarga del 33% antes de incrustar imágenes más grandes. Los bytes originales se leen del campo de entrada y la salida codificada permanece local, por lo que incluso iconos no publicados pueden probarse en marcado sin subirlos a ningún sitio.

Principio técnico

Base64 es una de varias codificaciones binario-a-texto especificadas en RFC 4648 (S. Josefsson, octubre 2006), junto con Base16 (hex) y Base32. El nombre 'Base64' y su alfabeto se definieron originalmente para Privacy-Enhanced Mail (RFC 989, 1987), donde PEM envolvía material binario S/MIME y X.509 dentro de una envoltura ASCII imprimible para que pudiera sobrevivir a transportes limpios de 7 bits. El mismo alfabeto se convirtió después en el estándar de facto para MIME (RFC 2045), firmas JWT (RFC 7519), URIs data: en HTML (RFC 2397), blobs de clave pública SSH (RFC 4253 §6.6) y archivos puntero de Git LFS (que almacenan hashes SHA-256 como Base64). Los packfiles de Git NO son Base64 — usan codificación delta con compresión zlib, y los IDs de objetos Git son cadenas hexadecimales SHA-1 de 40 caracteres, no Base64. El coste: cada 3 bytes de entrada se convierten en 4 caracteres de salida, así que la salida codificada es exactamente 4/3 del tamaño (33,3% de sobrecarga). Para un blob binario de 10 MB la forma codificada es ~13,3 MB. El mecanismo: dividir la entrada en grupos de 3 bytes (24 bits); cada grupo se descompone en cuatro valores de 6 bits; cada valor de 6 bits selecciona un carácter de un alfabeto de 64 caracteres. El alfabeto canónico es A-Z (índices 0-25), a-z (26-51), 0-9 (52-61), '+' (62), '/' (63), con '=' como carácter de relleno. El ejemplo clásico de RFC 4648: 'Man' (0x4d 0x61 0x6e) se empaqueta en el valor de 24 bits 0x4d616e; dividido en fragmentos de 6 bits da 0x0d 0x16 0x0e 0x0a, mapeado a 'TWFu'. Cuando la longitud de entrada no es múltiplo de 3, el grupo final se rellena con ceros a la derecha: 1 byte restante → 2 fragmentos de 6 bits significativos + '==' (2 caracteres de relleno); 2 bytes restantes → 3 fragmentos significativos + '=' (1 relleno). Los caracteres de relleno no contienen información, pero hacen que la longitud de codificación sea una función determinista de la longitud de entrada y permiten a los decodificadores rechazar entrada truncada. En el navegador, Base64 tiene dos trampas notorias. Primero, `btoa` y `atob` (las variantes DOMString) operan sobre unidades de código Latin-1, no bytes — pasar una cadena que contenga U+00E9 (é) o U+4E2D (中) lanza InvalidCharacterError. La página lo resuelve pasando por `TextEncoder().encode(str)` (siempre UTF-8) antes de llamar a `btoa`, y `TextDecoder().decode(bytes)` después de `atob`. Los caracteres multi-byte UTF-8 se expanden: '你' son 3 bytes (0xe4 0xbd 0xa0) → 4 caracteres base64 (8 caracteres base64 para '你好'). Segundo, Base64URL (RFC 4648 §5) reemplaza '+' y '/' por '-' y '_' y elimina el relleno, porque '+' y '/' son significativos para URLs y '=' termina cadenas de consulta. JWT (RFC 7519) y JWS (RFC 7515) requieren Base64URL precisamente por esta razón. Base64 es codificación, no cifrado — la forma codificada tiene cero secrecía, y el alfabeto es tan corto que cualquier observador lee el resultado trivialmente. Confundir Base64 con un mecanismo de seguridad es un patrón CVE: CVE-2004-2761 documentó la colisión de prefijo elegido MD5 en X.509 que permitía a atacantes forjar certificados con firmas MD5 en colisión, mientras que CVE-2005-4900 y otros involucraban la vieja práctica de hashes de contraseña md5crypt `$1$` siendo recodificados o re-hasheados por una capa de autenticación que confundía los bytes decodificados de Base64 con credenciales frescas. El patrón que se repite es el mismo: un sistema trata la codificación como si añadiera una capa de secrecía que no tiene, y el resultado es explotable. Para secretos reales usa AES-GCM (RFC 5288) o ChaCha20-Poly1305 (RFC 8439). Para compresión seguida de Base64 (lo que hace `gzip -b64`), ten en cuenta que la forma codificada es aproximadamente 1,37× el tamaño comprimido, y cualquier cambio de byte en el flujo comprimido rompe la decodificación — así que Base64 es una mala capa de integridad; HMAC-SHA256 sobre los bytes antes de codificar es el enfoque correcto.

  • RFC 4648 (octubre 2006) define Base64, Base32 y Base16 con un alfabeto canónico (A-Z, a-z, 0-9, +, /) y '=' como carácter de relleno. La variante MIME (RFC 2045) inserta saltos de línea cada 76 caracteres para el transporte; la variante URL-safe (Base64URL, RFC 4648 §5) reemplaza + y / por - y _ y elimina el relleno — usada por JWT (RFC 7519), JWS (RFC 7515) y JWK (RFC 7517).
  • Mecanismo: 3 bytes de entrada (24 bits) → 4 caracteres de salida (cada uno de 6 bits). La sobrecarga es del 33,3% — cada 1 MB de entrada binaria se convierte en 1,33 MB de Base64. Para ASCII la proporción puede ser aún peor cuando la entrada contiene '=' u otros caracteres que son escapados por protocolos circundantes.
  • Regla de relleno: longitud de entrada módulo 3 = 0 → sin relleno; módulo 3 = 1 → '==' (dos caracteres de relleno, un byte codificado); módulo 3 = 2 → '=' (un carácter de relleno, dos bytes codificados). '=' no contiene información; solo permite al decodificador saber cuántos bytes se descartaron.
  • Trampa de UTF-8 + btoa: `btoa('é')` lanza InvalidCharacterError porque btoa trata la entrada como unidades de código Latin-1. La página lo resuelve codificando a través de `TextEncoder` (UTF-8) antes de btoa, y decodificando a través de `TextDecoder` después de atob. Sin este paso, cualquier cosa fuera de U+0000..U+00FF se convierte en '0 bytes codificados' en lugar de un error.
  • Base64URL es requerido para JWT, JWS y JWK (RFC 7519/7515/7517). Usa '-' y '_' en lugar de '+' y '/' (caracteres significativos para URLs) y elimina el relleno '=' (que termina cadenas de consulta). Pasar un segmento de cabecera JWT a un decodificador Base64 en lugar de Base64URL devuelve basura; la página no auto-detecta — elige la variante correcta para el payload.
  • Rendimiento: la codificación es aproximadamente 400-700 MB/s en V8 en un portátil moderno (un bucle ajustado con búsquedas en tabla y desplazamientos de bits). La decodificación tiene velocidad similar. Para blobs grandes (10+ MB) el cuello de botella es la asignación, no el cálculo — el búfer de salida es un 33% mayor y `TextEncoder/TextDecoder` hace una copia.
  • Base64 es codificación, no cifrado — cualquiera con la cadena puede leerla. CVE-2004-2761 (colisión de prefijo elegido MD5 en firmas de certificados X.509) y muchos writeups de CTF usan esta concepción errónea como primer peldaño. Para secretos usa AES-GCM (RFC 5288) o ChaCha20-Poly1305 (RFC 8439). Para data URIs, vigila el tamaño codificado: una imagen de 10 MB se convierte en una URL de 13,3 MB, que excede la mayoría de límites de longitud de URL del navegador y la mayoría de límites de tamaño de correo.
  • Nota de migración: Base16 (hex) es preferido en protocolos de bajo nivel y salida de hashes porque cada byte se mapea exactamente a 2 caracteres y la longitud es predecible (sin cálculos de relleno). Base32 es preferido para transcripción humana (sin caracteres confundibles). Base64 es el valor por defecto universal para transporte binario en protocolos de texto, pero está siendo gradualmente reemplazado por bytes crudos sobre HTTP/2 y WebTransport donde el framing lo permite.

Ejemplos

Codificar texto ASCII

Entrada: Hello
Salida:  SGVsbG8=    (5 bytes -> 8 caracteres, 1 carácter de relleno)

Entrada: Hello, World!
Salida:  SGVsbG8sIFdvcmxkIQ==    (13 bytes -> 18 caracteres, 1 carácter de relleno)

Entrada: Man
Salida:  TWFu    (3 bytes -> 4 caracteres, sin relleno)

El ejemplo 'Man' es el vector canónico de RFC 4648: los bytes 0x4D 0x61 0x6E
se empaquetan en el valor de 24 bits 0x4D616E, se dividen en fragmentos de 6
bits 0x0D 0x16 0x0E 0x0A, y se mapean a T W F u mediante el alfabeto estándar.

Codificar texto UTF-8 (chino)

Entrada: ni hao   (3 bytes ASCII)
Salida:  5L2g5aW9    (8 caracteres)

Entrada: ni hao shi jie   (4 caracteres CJK, 12 bytes UTF-8)
Salida:  5L2g5aW95LiW55WM    (16 caracteres)

Cada carácter CJK se expande a 3 bytes UTF-8 (E4 BD A0 etc.), por lo que
la salida Base64 crece ~4/3 y luego ~4/3 de nuevo - aproximadamente 2,67x
el conteo de caracteres en la salida codificada. La página primero pasa por
TextEncoder().encode(str) para evitar la trampa btoa('InvalidCharacterError')
en entradas no ASCII.

Decodificar y hacer ida y vuelta de un segmento JWT

Codificado: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Decodificado: {"alg":"HS256","typ":"JWT"}

Ida y vuelta:
  encode('{"alg":"HS256","typ":"JWT"}') -> eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
  decode('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9') -> {"alg":"HS256","typ":"JWT"}

Los segmentos JWT usan Base64URL, así que la página debe aceptar '-' / '_'
junto a los estándares '+' / '/'. Una cabecera JWT pasada a un decodificador
Base64 estricto devuelve basura - elige la variante correcta para la
carga útil.

Base64 vs Base64URL

Entrada: Hello><h2>

Estándar:    SGVsbG8+PGgyPg==    (relleno + / =; seguro dentro de JSON / correo)
Seguro URL:  SGVsbG8-PGIyPg       (- _ sin relleno; seguro en rutas/consultas URL)

Diferencias:
  '+' (62)  ->  '-'   y  '/' (63)  ->  '_'
  el relleno '=' se elimina por completo en la forma segura para URL
Usa Base64URL para JWT, JWS, JWK y cualquier token que viaje en una cadena
de consulta de URL, porque '+' / '/' son significativos en URL y '=' termina
la consulta.

Preguntas frecuentes

¿Base64 es cifrado?

No. Base64 es una codificación, no un cifrado. Solo convierte bytes arbitrarios en 64 caracteres ASCII imprimibles (A-Z, a-z, 0-9, +, /) para que sobrevivan a sistemas que dañan los datos binarios. Cualquiera con la cadena codificada puede decodificarla al instante: no hay ningún secreto involucrado.

¿Por qué mi salida codificada termina con uno o dos signos =?

Base64 emite 4 caracteres de salida por cada 3 bytes de entrada. Cuando la longitud de entrada no es múltiplo de 3, el codificador rellena con = para que la longitud del resultado siga siendo múltiplo de 4. Un byte sobrante de entrada → dos =; dos sobrantes → un =; entrada alineada → ninguno. Algunas implementaciones omiten el relleno, lo cual es legal pero no totalmente interoperable.

¿Qué es Base64 URL-safe?

El Base64 estándar incluye / y +, que tienen un significado especial en URLs y nombres de archivo. El Base64 URL-safe (RFC 4648 §5) los reemplaza por _ y - y suele eliminar el relleno =. Úsalo para tokens JWT, parámetros de URL y nombres de archivo; usa Base64 estándar en el resto de casos.

¿Por qué la cadena Base64 es ~33% más larga que el original?

Cada 6 bits de entrada se convierten en un carácter de salida de 8 bits, así que el tamaño codificado = ceil(input_length / 3) * 4. Eso es aproximadamente 4/3 de la entrada (33% de sobrecarga). Es el coste de representar bytes arbitrarios en ASCII imprimible.

¿Qué formatos de entrada puedo pegar aquí?

Para codificar, pega texto plano (codificado como UTF-8 internamente) o sube un archivo. Para decodificar, pega una cadena Base64 con o sin espacios en blanco: el decodificador elimina los saltos de línea automáticamente. Si la decodificación falla, comprueba si hay caracteres extraños o falta algún = de relleno.

¿Puede Base64 transportar contenido de archivos binarios?

Sí. Es su uso principal: imágenes incrustadas en HTML/CSS (URLs data:), adjuntos de email (MIME) y credenciales en cabeceras HTTP (Basic Auth) usan Base64 para meter contenido binario en canales solo de texto. Ten en cuenta que la carga útil resultante es un 33% más grande que el archivo original.

¿Debería usar Base64 para ocultar datos sensibles?

Nunca. Base64 es totalmente reversible sin clave: tratarlo como ofuscación es un error común que ha filtrado contraseñas y tokens en muchos incidentes reales. Usa cifrado adecuado o un gestor de secretos para cualquier cosa sensible.