Base64: codificar y decodificar texto, archivos e imágenes en línea

Base64: codificar y decodificar texto, archivos e imágenes en línea

Convierte texto, un archivo o una imagen a Base64 (y al revés) en el navegador — data URI, adjunto email, segmento JWT. 100 % local.

18.09.2026
15 min de lectura
Compartir este artículo:
Base64CodificaciónData URITutorial

Por qué Base64 sigue apareciendo en cada stack

Una imagen de fondo CSS que no puede cargar un archivo aparte, un adjunto MIME que debe viajar en ASCII, un segmento JWT entre dos puntos, una opción de WordPress serializada y luego envuelta en Base64: ninguno de estos es un problema de cifrado. Son problemas de transporte. El codificador/decodificador Base64 en línea convierte texto Unicode en un alfabeto compatible con ASCII y viceversa, todo en la pestaña. El convertidor de imagen a Base64 hace lo mismo con un archivo PNG, JPEG, GIF, WebP o SVG local, como data URI o como Base64 en bruto. No se sube nada. Base64 no es un hash, ni un cifrado, ni un sustituto de TLS. Es una forma de llevar bytes por canales que solo aceptan letras, dígitos, +, / y padding. Estas herramientas están reunidas en el hub de herramientas de codificación.

Ida y vuelta UTF-8 para texto Unicode (acentos, CJK, emoji), a diferencia del btoa nativo, que lo altera o lo rechaza
Modo URL-safe (RFC 4648): guion y guion bajo en lugar de más y barra, padding omitido, como en los JWT
La decodificación ignora los espacios, así que las líneas MIME plegadas y los segmentos JWT copiados se siguen decodificando
Herramienta de imagen: PNG, JPEG, GIF, WebP y SVG de hasta 32 MiB, como data URI o Base64 en bruto, con una vista previa mediante un elemento img
Todo se ejecuta en local: la cadena no sale del navegador
Encadena con Decodificar JWT, Codificar URL, entidades HTML, data URI SVG y formateador JSON

Cuándo codificar en el navegador, y cuándo no

Buenos usos

El codificador es un bisturí para una cadena que puedes pegar, no un CDN.

Leer un header o payload JWT, o decodificar una línea MIME plegada, sin abrir un REPL
Construir una data URI CSS pequeña para un icono ya optimizado
Comprobar que el Base64 de un backend sigue UTF-8 (café, emoji) y no bytes Latin-1
Quitar una envoltura Base64 de un blob WordPress o Laravel antes de unserialize
Enseñar la diferencia entre codificación, hash y cifrado con una ida y vuelta en la misma pestaña
Déjaselo al pipeline

Si la respuesta depende de un archivo que el navegador no debería sostener, o de criptografía, quédate en CI o en un gestor de secretos.

Imágenes hero de producción, fotos de producto, o cualquier asset donde un 33 % extra de CSS cueste más que una petición HTTP
Secretos: Base64 no los oculta, así que usa una bóveda y no un codificador
Almacenamiento de contraseñas: un hash (bcrypt o Argon2), nunca una codificación
HEIC, PDF o archivos de más de 32 MiB quedan fuera de image-to-base64
Verificar una firma JWT contra un JWKS: jwt-verify, no decodificar y esperar que baste

Los errores de Base64 que te hacen perder una tarde

Llamar cifrado a la codificación

Quien pueda leer la cadena puede decodificarla. Base64 no tiene clave, ni control de integridad, ni confidencialidad. Un token que parece opaco en un log sigue siendo texto claro tras una sola decodificación. Si los bytes deben permanecer secretos, cífralos (o no los pongas en el payload). Si deben permanecer auténticos, fírmalos con un HMAC o con una firma JWT, no con Base64 en sí.

Enviar una clave API en Base64 y llamarla «ofuscada»
Guardar contraseñas en Base64 en lugar de un hash (bcrypt, Argon2)
Asumir que una data URI oculta el asset a quien abre el código fuente
Confundir Base64 con SHA-256: un digest es de un solo sentido; Base64 es reversible por diseño
Trata Base64 como papel de regalo. Decodifica cuando quieras los bytes; nunca tomes el envoltorio por un candado.
Mezclar Base64 estándar y Base64URL

RFC 4648 define dos alfabetos. El Base64 estándar usa + y / y suele conservar el padding =. El Base64 URL-safe (JWT, cookies, rutas) usa - y _ y normalmente omite el padding. La opción URL-safe de FastMinify hace ambas sustituciones y quita el padding al codificar. Al decodificar, el modo URL-safe restaura el alfabeto estándar y el padding, mientras que el modo estándar pasa la cadena tal cual a atob: atob tolera un padding ausente, pero rechaza - y _. Una cadena URL-safe con la opción desactivada da, por tanto, un error de entrada inválida, y una cadena estándar con la opción activada se decodifica igualmente, porque solo se sustituyen esos dos caracteres.

Pegar un segmento JWT con guiones y guiones bajos con URL-safe desactivado
Fiarse de una decodificación correcta sobre una copia truncada: un = ausente se tolera, así que una cadena cortada puede dar un texto más corto
Copiar el payload de una data URI (alfabeto estándar, con padding) a un campo JWT
Sustituir + por un guion a mano en un sitio y olvidar sustituir / por un guion bajo
Si el decodificador rechaza una cadena con guiones o guiones bajos, activa URL-safe. Déjalo desactivado para MIME, blobs cercanos a PEM y la mayoría de data URI.
Pegar un JWT entero en el decodificador de texto

Un JWT compacto está formado por tres segmentos Base64URL separados por puntos, escritos header.payload.signature. Los puntos no son Base64. La herramienta Base64 decodifica una cadena de alfabeto, no un token con puntos. Su mensaje de error lo dice: pega solo los caracteres codificados, sin puntos. Para un JWT, copia cada parte entre los puntos o abre el decodificador JWT e inspecciona header y payload en un paso.

Pegar eyJhbGciOi… de un solo bloque, puntos incluidos
Decodificar el segmento de firma como texto UTF-8 y esperar un JSON legible
Usar jwt-decode cuando solo tienes un blob Base64 sin forma header.payload.signature
Olvidar que jwt-decode lee claims y no sustituye a jwt-verify contra un JWKS
JWT entero → jwt-decode. Un segmento o una cadena cualquiera → Base64. Verificación de firma → jwt-verify, no las herramientas de esta guía.
Incrustar una foto como data URI en el CSS de producción

Base64 infla los datos binarios alrededor de un 33 % (3 bytes se convierten en 4 caracteres ASCII). Un JPEG de 200 KiB pasa a ser unos 267 KiB de CSS. La imagen deja de poder almacenarse en caché por separado de la hoja de estilo y hace más pesada una hoja que ya bloquea el renderizado. Con HTTP/2, las peticiones adicionales cuestan poco, lo que elimina el principal motivo para incrustar. Las data URI compensan en iconos minúsculos que de otro modo costarían una petición. Pierden con imágenes de cabecera, fotos de producto y todo lo que ya publicas minificado como archivo.

Soltar un PNG de 2 MiB en image-to-base64 y pegar el resultado en una hoja de estilo
Creer que Brotli anula el 33 % de crecimiento: el texto se comprime, pero solo hasta aproximadamente el tamaño del archivo original
Saltar la guía de optimización SVG antes de incrustar un SVG exportado
Usar la herramienta Base64 de texto sobre una imagen binaria: codifica texto Unicode, no bytes de archivo
Convierte la imagen en la pestaña para ver la URI. Úsala solo si el archivo es tan pequeño que una petición extra costaría más que el sobrecoste del 33 %.

Elegir entre Base64 estándar, URL-safe y data URI

Tres salidas, una familia de alfabetos

Los bytes no cambian. La escritura sí. El Base64 estándar es lo que emiten el MIME del correo y la mayoría de las API. El Base64 URL-safe es lo que necesitan JWT, cookies firmadas y segmentos de ruta para que + y / no choquen con la sintaxis de las consultas. Una data URI es Base64 estándar con el prefijo data:<mime>;base64, para que un navegador trate la cadena como un recurso.

Estándar: A–Z a–z 0–9 + / y el padding =, usado por la salida cruda de image-to-base64, la mayoría de las documentaciones y la mayoría de las bases de datos
URL-safe: A–Z a–z 0–9, guion y guion bajo, padding omitido. Es una opción de la herramienta de texto y la escritura de los header y payload de un JWT
Data URI: data:image/png;base64,iVBOR…, salida por defecto de image-to-base64, para url() en CSS e img src
El prefijo no es Base64. No pegues data:image/… en el decodificador de texto; quítalo o usa la herramienta de imagen
Herramienta de texto vs image-to-base64 vs data URI SVG

Tres herramientas, tres entradas. El codificador de texto aplica UTF-8 y luego Base64 a una cadena, pegada o leída de un archivo de texto. No interpreta un PNG como píxeles. El convertidor de imagen lee los bytes del archivo y comprueba el tipo MIME. Se aceptan PNG, JPEG, GIF, WebP y SVG, y un tipo MIME vacío se rechaza en lugar de adivinarse. Limita los archivos a 32 MiB y emite una data URI o Base64 en bruto. La vista previa usa solo un elemento img: el SVG nunca se inyecta en el DOM como marcado. Para un SVG usado en CSS, con elección entre utf-8 y Base64 y un fragmento CSS dedicado, usa SVG a data URI en el hub SVG. Su entrada SVG está limitada a 512 KiB, un límite distinto para otro trabajo.

Cadena Unicode, blob JSON, segmento JWT, snippet de config → /base64
Archivo de imagen de mapa de bits o SVG local que quieres como data:image/… → /image-to-base64
Fuente SVG que quieres como CSS url() con elección de encoding → /svg-to-data-uri
Codificar con porcentaje un valor de consulta no es Base64: eso es /url-encode
Base64 no es URL-encode, entidades HTML ni un hash

Se mezclan porque todos «hacen una cadena más segura». Resuelven colisiones distintas. URL encode codifica en porcentaje los caracteres reservados de una URI. Las entidades HTML escapan el marcado para que una cadena quepa en un atributo. Un hash (SHA-256, HMAC) ofrece integridad o autenticidad en un solo sentido; consulta las herramientas de hash y HMAC del hub de codificación, no este artículo. Base64 solo cambia cómo se escriben los bytes.

Necesitas una cadena en un parámetro de consulta → URL encode, no Base64
Necesitas una cadena dentro de HTML sin romper la etiqueta → entidades HTML
Necesitas detectar manipulación → hash o HMAC, y quizá Base64 del digest para el transporte
Necesitas bytes transportables en ASCII en JSON, un correo o una data URI → Base64

Qué hace realmente Base64 con tus bytes

Un alfabeto de 64 caracteres y un sobrecoste del 33 %

Base64 toma 24 bits (3 bytes) y los escribe como 4 caracteres de un alfabeto de 64 símbolos. Por eso la salida es más larga: 4/3, es decir, un 33 % más, más padding si la longitud de entrada no es múltiplo de 3. Ese sobrecoste es el precio de un alfabeto que sobrevive al correo, a las cadenas JSON y al CSS. Es lo contrario de la minificación. Si el payload es JSON que vas a servir por HTTP, minifica primero el JSON y codifica solo si una capa envolvente exige ASCII; consulta la guía de minificación JSON.

Antes

foo

Después

Zm9v
3 bytes de entrada → 4 caracteres de salida; 1 byte restante → 2 caracteres + ==; 2 bytes restantes → 3 caracteres + =
El alfabeto es ASCII: sobrevive al copiar y pegar, a YAML y a logs que destrozan lo binario
Los espacios de la cadena codificada se ignoran al decodificar en FastMinify; MIME suele plegar las líneas a 76 caracteres
La expansión va sobre la forma codificada. Gzip/Brotli sobre una data URI dentro de HTML es menos eficaz que gzip sobre el archivo original
UTF-8 primero, luego Base64

El btoa nativo de JavaScript opera sobre una cadena binaria (valores 0–255). Pásale café y codifica sin avisar el único byte Latin-1 de é en lugar de los dos bytes UTF-8; con un emoji o un carácter CJK lanza una excepción. FastMinify codifica los bytes UTF-8 con TextEncoder y luego Base64, con el mismo contrato que Node Buffer.from(text, 'utf8').toString('base64'). La decodificación hace lo inverso con TextDecoder. Los emojis y el CJK sobreviven. Si decodificas un blob que nunca fue texto UTF-8 (un PNG, un flujo gzip), obtienes caracteres de reemplazo, no un archivo. Ese blob va en image-to-base64 o en un volcado hex, no en un campo de texto.

Antes

café

Después

Y2Fmw6k=
café → Y2Fmw6k= (UTF-8 de é son dos bytes C3 A9)
Hello, 世界 → SGVsbG8sIOS4lueVjA==
btoa/atob nativos sin TextEncoder son la trampa Unicode clásica; la herramienta en línea no toma ese camino
Imágenes binarias: suelta el archivo en image-to-base64; no pegues «binario» en el codificador de texto
El padding, y por qué JWT lo omite

Cuando la longitud en bytes no es múltiplo de 3, el Base64 estándar añade = o == para que la longitud de la cadena sea múltiplo de 4. Los contextos URL-safe (JWT, algunas cookies) omiten ese padding porque = es un delimitador en las consultas. La codificación URL-safe de FastMinify lo quita; la decodificación URL-safe lo restaura antes de atob. La decodificación estándar no lo necesita, porque atob tolera un padding ausente. Ejemplos clásicos de la RFC: f → Zg==, fo → Zm8=, foo → Zm9v.

Antes

f

Después

Zg==
La decodificación estándar tolera un padding ausente, pero rechaza una cadena un carácter más larga que un múltiplo de 4
Los dos bytes FB FF dan +/8= en Base64 estándar y -_8 en Base64 URL-safe, con el alfabeto cambiado y sin padding
Un header JWT {"alg":"HS256","typ":"JWT"} se codifica como eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 sin padding
No añadas padding a mano al payload de una data URI salvo para reparar una copia truncada

Codificar texto, un archivo o una imagen en la pestaña

Codificar o decodificar una cadena

Abre el codificador/decodificador Base64. Pega el texto o selecciona un archivo de texto (el límite en el navegador es de 32 MiB, como en las demás selecciones de archivos del sitio). Elige Codificar o Decodificar. Deja desactivada la opción Base64 compatible con URL (URL-safe) para MIME, payloads de data URI y la mayoría de los ejemplos de API. Actívala para segmentos JWT, valores de cookies firmadas y todo lo que vaya en una ruta. Carga el ejemplo si solo quieres ver cómo funciona. Todo permanece en la pestaña.

1

1. Pegar o seleccionar la fuente

Texto Unicode para codificar; una cadena de alfabeto Base64 para decodificar. No incluyas puntos de JWT ni un prefijo data:.

2

2. Ajustar URL-safe según el origen de la cadena

Activada, la opción usa guion y guion bajo y no deja padding. Desactivada, usa más y barra y conserva el padding =. Una cadena URL-safe decodificada con la opción desactivada da un error, no una decodificación parcial.

3

3. Copiar el resultado

Si decodificaste JSON minificado, envíalo al formateador JSON o al desminificador JSON en línea. Solo cambian el formato, así que los nombres ya perdidos siguen perdidos.

Convertir una imagen local en data URI

Abre la herramienta imagen a Base64. Elige una imagen (PNG, JPEG, GIF, WebP o SVG, de hasta 32 MiB) o suéltala en la página. Elige Data URI para el CSS (url()) y para img src, o Base64 en bruto para pasarlo a otra herramienta. La vista previa pasa por un elemento img y el SVG no se monta como DOM. Los tipos MIME vacíos o no compatibles se rechazan porque la herramienta no adivina. Tras un icono minúsculo, puedes pegar la URI en el CSS. Tras una fotografía, en general no conviene.

Tipos permitidos: image/png, image/jpeg, image/gif, image/webp e image/svg+xml; PDF y HEIC no son compatibles
Límite estricto de 32 MiB: los archivos mayores se rechazan
La salida por defecto empieza por un prefijo como data:image/png;base64, y el modo en bruto lo quita
SVG a optimizar primero: minify-svg / la guía de optimización SVG, luego codificar
JWT, URL, JSON y PHP después de Base64

La codificación suele ser un paso de una sesión de depuración más larga. El hub de codificación reúne las herramientas vecinas.

JWT compacto: decodificar un JWT (header y payload). Fabricar un token de prueba con JWT encode, lo que sigue sin ser una verificación
Cadenas de consulta: URL encode / URL decode usan la codificación porcentual, otro alfabeto
JSON decodificado y minificado: formateador JSON, o minificación de JSON si empaquetas un payload de API; consulta también optimizar JSON de una API REST
Blob al estilo de WordPress: decodificar Base64 y luego deserializar PHP si los bytes internos son un array PHP serializado; consulta la guía de serialización PHP

Cuándo basta el navegador y cuándo aún necesitas un REPL

Node Buffer con el mismo contrato UTF-8

Si la cadena ya vive en un script, el Buffer de Node sigue el mismo camino UTF-8 luego Base64 que FastMinify. Usa base64url cuando el consumidor es una librería JWT.

Ejemplo básico

const { Buffer } = require('node:buffer') const encoded = Buffer.from('café', 'utf8').toString('base64') // Y2Fmw6k= const urlSafe = Buffer.from('café', 'utf8').toString('base64url') // Y2Fmw6k const roundTrip = Buffer.from(encoded, 'base64').toString('utf8') // café
TextEncoder del navegador en lugar de btoa sobre Unicode

El par nativo btoa / atob es una API de cadena binaria. Envuélvelo con TextEncoder/TextDecoder o corromperás todo lo que salga de Latin-1. Esa envoltura es exactamente lo que ya hace la herramienta de texto de FastMinify.

Ejemplo básico

const bytes = new TextEncoder().encode('café') let binary = '' bytes.forEach((b) => { binary += String.fromCharCode(b) }) const encoded = btoa(binary) const decodedBytes = Uint8Array.from(atob(encoded), (c) => c.charCodeAt(0)) const text = new TextDecoder().decode(decodedBytes)
openssl para un archivo en disco

Un PEM local, un archivo binario de prueba o un job de CI que no debe abrir un navegador: openssl sigue siendo la herramienta adecuada. FastMinify no sustituye un pipeline que ya calcula hashes o firma archivos en disco.

Ejemplo básico

openssl base64 -in icon.png -out icon.b64 openssl base64 -d -in icon.b64 -out icon.png
FastMinify base64 / image-to-base64

Sin instalación, sin enviar nada, texto UTF-8 más un convertidor de imagen dedicado con un tope de 32 MiB y una opción URL-safe. Los límites: la herramienta de texto no es un codificador de archivos binarios, HEIC y PDF quedan fuera de la herramienta de imagen y la verificación JWT es otra página. Úsala para inspeccionar, enseñar y salir del paso en una máquina sin Node, y mantén openssl o Buffer en CI.

Conclusión

Base64 es un adaptador aburrido y esencial: bytes de entrada, un alfabeto compatible con ASCII de salida, un 33 % más grande y totalmente reversible. FastMinify ejecuta ese adaptador en el navegador. Codifica texto UTF-8 con un alfabeto URL-safe opcional, y un convertidor de imagen aparte (PNG, JPEG, GIF, WebP, SVG, 32 MiB) emite una data URI o Base64 en bruto sin inyectar SVG en el DOM. No cifra, no calcula hashes y no sustituye ni a jwt-verify ni a un CDN. Codifica el fragmento, decodifica la línea de log, incrusta el icono y para. Empieza en el hub de herramientas de codificación y abre JWT decode cuando la cadena tenga dos puntos.

Alinea URL-safe con el origen: activado para segmentos JWT, desactivado para MIME y data URI
Nunca trates Base64 como cifrado ni como hash de contraseña
Usa image-to-base64 para archivos; la herramienta de texto es Unicode, no píxeles
Incrusta data URI solo si el archivo es lo bastante pequeño para absorber el sobrecoste del 33 %
JWT entero → jwt-decode; política de firma → jwt-verify
Compartir este artículo
Compartir este artículo: