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:
Base64
Codificación
Data URI
Tutorial

Por qué Base64 sigue apareciendo en cada stack

Un background CSS que no puede hacer fetch de un archivo, 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 a un alfabeto ASCII-safe y de vuelta, todo en la pestaña. El convertidor de imagen a Base64 hace lo mismo con un PNG, JPEG, GIF, WebP o SVG local — como data URI o como Base64 crudo. Nada se sube. 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. El clúster vive en el hub de herramientas de codificación.

Ida y vuelta UTF-8 para texto Unicode — acentos, CJK, emoji — no el camino roto de btoa nativo
Modo URL-safe (RFC 4648): - y _ en lugar de + y /, padding omitido — el alfabeto real de los JWT
La decodificación ignora espacios, así que las líneas MIME plegadas y los segmentos JWT copiados siguen parseando
Herramienta de imagen: PNG, JPEG, GIF, WebP, SVG, 32 MiB, data URI o Base64 crudo, vista previa solo vía img
100 % local — la cadena no sale del navegador
Encadena con JWT decode, URL encode, entidades HTML, data URI SVG, formateador JSON

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

Buenos encajes

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 una mentira 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 inmediata
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; usa una bóveda, no un codificador
Almacenamiento de contraseñas — hashear (bcrypt/Argon2), nunca codificar
HEIC, PDF o archivos por encima de 32 MiB — fuera de alcance de image-to-base64
Verificar una firma JWT contra un JWKS — <a href="/es/jwt-verify" class="text-primary hover:underline">jwt-verify</a>, no decodificar y esperar que baste

Los errores de Base64 que te queman 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 un decode. Si los bytes deben permanecer secretos, cifra (o no los pongas en el payload). Si deben permanecer auténticos, firma — HMAC o una firma JWT, no 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
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. El interruptor URL-safe de FastMinify hace ambas sustituciones y quita el padding al codificar. En decode URL-safe, el alfabeto se remapea y se restaura el padding. Si el interruptor no coincide con la cadena, obtienes un error de entrada inválida — no un decode «aproximado».

Pegar un segmento JWT con - y _ con URL-safe desactivado
Esperar que el modo estándar acepte una cadena sin su padding =
Copiar el payload de una data URI (alfabeto estándar, con padding) a un campo JWT
Sustituir + por - a mano en un sitio y olvidar / → _
Pegar un JWT entero en el decodificador de texto

Un JWT compacto son tres segmentos Base64URL separados por puntos: header.payload.signature. Los puntos no son Base64. La herramienta Base64 decodifica una cadena de alfabeto, no un token con puntos. El mensaje de error de la página lo dice: pega solo los caracteres codificados, sin puntos; para un JWT, copia cada parte entre los puntos — o, más simple, abre el decodificador JWT e inspecciona header más 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 — no sustituye a jwt-verify contra un JWKS
Inlinear una foto como data URI en el CSS de producción

Base64 infla los datos binarios alrededor de un 33 % (3 bytes se vuelven 4 caracteres ASCII). Un JPEG de 200 KiB se convierte en ~267 KiB de CSS. Ese CSS no tiene caché propio, bloquea el parsing y pelea con el multiplexado HTTP/2. Las data URI ganan para iconos minúsculos que de otro modo costarían una petición. Pierden para héroes, fotos de producto y todo lo que ya minificas como archivo.

Soltar un PNG de 2 MiB en image-to-base64 y pegar el resultado en una hoja de estilo
Esperar que una data URI comprima mejor que el archivo original bajo Brotli — el alfabeto es más denso, no más pequeño
Saltar la <a href="/es/blog/guia-optimizacion-svg-web" class="text-primary hover:underline">guía de optimización SVG</a> antes de inlinear un SVG exportado
Usar la herramienta Base64 de texto sobre una imagen binaria: codifica texto Unicode, no bytes de archivo

Base64 estándar, URL-safe, data URI — elige la representación

Tres salidas, una familia de alfabetos

Los bytes no cambian. La ortografía sí. El Base64 estándar es lo que emiten el MIME de email y la mayoría de APIs. El Base64 URL-safe es lo que necesitan JWT, cookies firmadas y segmentos de ruta para que + y / no choquen con la sintaxis de query. Una data URI es Base64 estándar con el prefijo data:&lt;mime&gt;;base64, para que un navegador trate la cadena como un recurso.

Estándar: A–Z a–z 0–9 + / y padding = — salida cruda de image-to-base64, la mayoría de docs y bases
URL-safe: A–Z a–z 0–9 - _ , padding omitido — interruptor de la herramienta de texto; ortografía header/payload JWT
Data URI: data:image/png;base64,iVBOR… — salida por defecto de image-to-base64, CSS url(), 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 sobre una cadena (pegado o archivo de texto). No interpreta un PNG como píxeles. El convertidor de imagen lee los bytes del archivo, comprueba el MIME (PNG, JPEG, GIF, WebP, SVG — MIME vacío rechazado, sin sniff silencioso), limita a 32 MiB y emite una data URI o Base64 crudo. La vista previa usa solo un elemento img: el SVG nunca se inyecta en el DOM como markup. Para SVG-as-CSS con elección utf-8 o Base64 y un snippet CSS dedicado, usa SVG a data URI en el hub SVG (entrada SVG de 512 KiB — otro techo, otro trabajo).

Cadena Unicode, blob JSON, segmento JWT, snippet de config → /base64
Archivo ráster 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
Percent-codificar un valor de query no es Base64 — eso es /url-encode
Base64 no es URL-encode, entidades HTML ni un hash

Los desarrolladores los mezclan porque todos «hacen una cadena más segura». Resuelven colisiones distintas. URL encode percent-codifica caracteres reservados de una URI. Las entidades HTML escapan markup para que una cadena quepa en un atributo. Un hash (SHA-256, HMAC) es integridad o autenticidad de un solo sentido — ver hash/HMAC en el 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 query → 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 ASCII-safe en JSON, email o una data URI → Base64

Qué hace realmente Base64 con tus bytes

Un alfabeto de 64 caracteres y un impuesto 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, unos 33 % más, más padding si la longitud de entrada no es múltiplo de 3. El impuesto es el objetivo — cambias tamaño por un alfabeto que sobrevive al email, 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 el JSON primero y solo codifica si una capa envolvente exige ASCII; ver 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 en la cadena codificada se ignoran al decodificar en FastMinify — MIME suele plegar 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 lanza o produce una mentira, según el motor. FastMinify codifica los bytes UTF-8 con TextEncoder y luego Base64 — el mismo contrato que Node Buffer.from(text, 'utf8').toString('base64'). La decodificación invierte con TextDecoder. Emoji y 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 a image-to-base64 o a un dump hex, no a 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 de query. El encode URL-safe de FastMinify lo quita; el decode URL-safe lo restaura antes de atob. Ejemplos clásicos RFC: fZg==, foZm8=, fooZm9v.

Antes

f

Después

Zg==
Decode estándar: un padding ausente puede fallar — pega los = o activa URL-safe si el productor los omitió
El encode URL-safe de +/8= se convierte en -_8 (cambio de alfabeto y padding fuera)
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

Codifica en la pestaña: texto, luego un archivo, luego una imagen

Codificar o decodificar una cadena

Abre el codificador/decodificador Base64. Pega el texto (o sube un archivo de texto — techo cliente 32 MiB, la misma familia que otras selecciones de archivo del sitio). Elige Encode o Decode. Deja URL-safe apagado para MIME, payloads data-URI y la mayoría de ejemplos de API. Actívalo para segmentos JWT, cookies firmadas y todo lo que vaya en una ruta. Carga el ejemplo si solo quieres ver el pipeline. Todo permanece en la pestaña.

1

Paso 1 — Pegar o subir la fuente

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

2

Paso 2 — Ajustar URL-safe al productor

On: - _ y sin padding. Off: + / y padding =. Un desajuste es un error, no un decode parcial.

3

Paso 3 — Copiar el resultado

Si decodificaste JSON minificado, envíalo al formateador JSON o al desminificador JSON en línea — solo formato; los nombres ya perdidos siguen perdidos.

Convertir una imagen local en data URI

Abre la herramienta imagen a Base64. Suelta un PNG, JPEG, GIF, WebP o SVG (máx. 32 MiB). Elige data URI para CSS url() e img src, o Base64 crudo para encadenar con otra herramienta. La vista previa pasa por un elemento img; el SVG no se monta como DOM. Los MIME vacíos o exóticos se rechazan — la herramienta no adivina. Tras un icono minúsculo, puedes pegar la URI en CSS. Tras una fotografía, en general no.

Tipos permitidos: image/png, image/jpeg, image/gif, image/webp, image/svg+xml — no PDF, no HEIC en v1
Tope duro de 32 MiB — los archivos mayores se rechazan; no hay upload ilimitado
La salida por defecto empieza por data:&lt;mime&gt;;base64, — el modo crudo quita el prefijo
SVG a optimizar primero: minify-svg / la guía de optimización SVG, luego codificar
Después de Base64: JWT, URL, JSON, PHP

La codificación suele ser un paso de un debug más largo. El hub de codificación deja a los vecinos a un clic.

JWT compacto: decodificar un JWT (header + payload). Fabricar un token de prueba con JWT encode — sigue sin ser verificación
Query strings: URL encode / URL decode — percent-encoding, otro alfabeto
JSON decodificado y minificado: formateador JSON, o minificar JSON si empaquetas un payload de API — ver también optimizar JSON de una API REST
Blob estilo WordPress: decodificar Base64, luego deserializar PHP si los bytes internos son un array PHP serializado — guía de serialización PHP

Cuando el navegador basta — y cuando aún necesitas un REPL

Node Buffer — 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 — no llames 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, una fixture binaria o un job de CI que no debe abrir un navegador: openssl sigue siendo el martillo correcto. FastMinify no sustituye un pipeline que ya hashea 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 install, sin upload, texto UTF-8 más un convertidor de imagen dedicado con un techo honesto de 32 MiB y un interruptor URL-safe. Contrapartida: la herramienta de texto no es un codificador de archivo binario; HEIC/PDF quedan fuera de la herramienta de imagen; la verificación JWT es otra página. Úsala para inspeccionar, enseñar y desbloquear una máquina sin Node — luego mantén openssl o Buffer en CI.

Conclusión

Base64 es un adaptador aburrido y esencial: bytes de entrada, alfabeto ASCII-safe de salida, un 33 % más grande, totalmente reversible. FastMinify ejecuta ese adaptador en el navegador — texto UTF-8 con alfabeto URL-safe opcional, y un convertidor de imagen aparte (PNG, JPEG, GIF, WebP, SVG, 32 MiB) que emite una data URI o Base64 crudo sin inyectar SVG en el DOM. No cifra, no hashea y no sustituye ni a jwt-verify ni a un CDN. Codifica el snippet, decodifica la línea de log, inlinea 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 productor — segmentos JWT on, MIME y data URI off
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
Solo inlinea data URI si el asset es lo bastante pequeño para pagar el impuesto del 33 %
JWT entero → jwt-decode; política de firma → jwt-verify
Compartir este artículo
Compartir este artículo: