Base64 es la operación pseudo-segura que más he visto mal usada. Una persona del backend anuncia con orgullo cifré este token con Base64; el frontend asiente educadamente y luego lo revierte en una línea.

Este artículo existe para que la próxima vez que leas Base64 cifrado puedas decir de inmediato—esto no es cifrado.

Resumen de 30 segundos

  • Base64 es codificación, no cifrado. Mapea datos binarios a 64 caracteres imprimibles. Cualquiera que vea la cadena puede revertirla a los bytes originales.
  • Una línea para revertir: Buffer.from(str, ‘base64’).toString() en Node.js, atob(str) en el navegador. Listo.
  • Su trabajo real: permitir que datos binarios viajen por canales solo de texto—JSON, cuerpos de correo, query strings de URL.
  • No sirve para ocultar contraseñas, tokens o claves de API. Para eso necesitas cifrado real: AES, libsodium, age, GPG.

5 escenarios reales donde Base64 está mal

Escenario 1: cifrar contraseñas en archivos de configuración

db_password=cm9vdC1wYXNzLXdvcmQ=

Lo creas o no, esa cadena decodifica a root-pass-word.

Por qué los equipos caen: los archivos de configuración son el activo más filtrado en cualquier repositorio. Base64 parece añadir una contraseña, pero cualquiera con el archivo la revierte en 5 segundos.

El arreglo: usa SOPS, age, Vault, o al menos AES-GCM. Base64 es enmascaramiento, no cifrado.

Escenario 2: JWT cifra el payload

eyJhbG…lKxw

El fragmento intermedio suele ser Base64URL. Mételo en cualquier decodificador JWT online—ID de usuario, expiración, permisos están ahí.

Por qué los equipos caen: las firmas JWT engañan a la gente pensando invisible = seguro. El payload nunca va cifrado; está explícito en la especificación JWT—firmado, no cifrado. Si quieres el payload cifrado, usa JWE.

Escenario 3: cifras tu clave de API en la documentación

Authorization: Basic YWRtaW46cGFzc3dvcmQ=

Decodifica a admin:password.

Por qué los equipos caen: Authorization: Basic … aparece en tutoriales por todas partes; la gente nueva lo copia sin darse cuenta de que el fragmento tras Basic es solo username:password en texto plano codificado en Base64.

Escenario 4: ocultar IDs sensibles en URLs

/users/details?token=MTIzNDU2Nzg5MDEyMzQ1Ng==

Envuelve un ID interno en Base64, mételo en una URL, espera que nadie adivine la clave primaria subyacente.

Por qué los equipos caen: esto es oscuridad mediante codificación. Las cadenas Base64 parecen hash o cifrado, pero los IDs suelen ser enteros secuenciales, y Base64 solo añade una capa de adivinación, no seguridad. Alguien recorriendo los IDs en orden recorre la forma codificada en orden también.

Escenario 5: pegar fragmentos de código cifrados en Slack o correo

Alguien pega: descifra esto antes de producción, el secreto está en base64 Respuesta: qué? Remitente: yo, el original era secret_api_key_here_in_plain

Juro por proyectos fallidos que este escenario existe.

Por qué los equipos caen: asumiendo que Base64 esquiva búsqueda, copia, captura o OCR. No es así—las cadenas Base64 se ven distintivas y son exactamente lo que las herramientas automatizadas de auditoría de tráfico buscan.

4 hechos contraintuitivos sobre Base64

Hecho 1: las cadenas Base64 son 33% más largas que el original

La codificación agranda los datos. 3 bytes se convierten en 4 caracteres Base64, así que aGVsbG8= es más largo que hello. Si llamas a tu codificación cifrado y te quejas de que la salida es más larga, elegiste la herramienta equivocada.

Hecho 2: Base64 no es un hash

Los hashes son de un solo sentido (teóricamente irreversibles), Base64 es de doble sentido (totalmente reversible). Son herramientas distintas para trabajos distintos. Cualquiera que use Base64 para hashear contraseñas y las guarde en base de datos no guardó ningún hash—cualquier atacante las decodifica directamente.

Hecho 3: Base64 no es compresión

Es solo un intercambio de conjunto de caracteres. No se quita ningún dato. aGVsbG8= siempre ocupa ≥ los bytes de hello + padding.

Hecho 4: el btoa del navegador solo soporta Latin-1

Llamar btoa(‘你好’) lanza InvalidCharacterError porque btoa solo codifica puntos de código 0–255. Por eso nuestra herramienta Text Encoder va TextEncoder().encode() luego btoa luego TextDecoder().decode(), para ser UTF-8 safe de extremo a extremo.

Prácticas recomendadas

  1. Proteger contraseñas / tokens / claves de API: usa cifrado real. AES-256-GCM, libsodium (crypto_secretbox_easy), age, GPG—elige uno, nunca Base64.
  2. Meter binario en JSON o URLs: usa Base64, ese es su trabajo. La pestaña Base64 de nuestra herramienta Text Encoder usa por defecto la cadena UTF-8 safe, decodifica aGVsbG8= y verás hello.
  3. Transporte binario URL-safe: usa Base64URL (- y _ en lugar de + y /, sin padding). Empareja con JWT.
  4. Incrustar imágenes en HTML/CSS: usa data:image/…;base64,…—pero el HTML es +33% más grande y no puede cachearse en CDN, así que usa con moderación.
  5. Enseñar Base64 a novatos: enfatiza esto es un camión de mudanzas, no una bóveda. Los camiones mueven muebles de A a B y cualquier transportista puede ver el contenido; las bóvedas (Fort Knox) son lo que quieres para confidencialidad real.

Base64 es, por especificación, un esquema de codificación de caracteres (RFC 4648)—solo transporte. Escribir hello luego مرحبا luego hello de nuevo es movimiento puro sin significado de seguridad. Si necesitas seguridad, necesitas primitivas criptográficas reales.

Prueba nuestra herramienta Text Encoder, cambia a la pestaña Base64, pega cualquier cadena y codifica/decodifica al instante—ve la diferencia entre codificación y cifrado en un segundo. Si quieres comparar contra hashes (HMAC, SHA-256), mira nuestro crypto-tools.