Cómo codificar en Base64URL
- Escribe o pega el texto en Entrada · texto.
- Copia el Base64URL de Salida · Base64. URL-safe (- _) y Sin relleno (=) ya vienen marcados en esta página.
- Si el receptor quiere relleno, desmarca Sin relleno (=). Si quiere Base64 estándar, desmarca también URL-safe (- _), o usa el codificador Base64.
- Copia la salida o descárgala como
base64.txt.
Decodifica un valor con el decodificador Base64URL. Base64 a Base64URL convierte cadenas existentes entre los dos alfabetos.
Qué cambia respecto al Base64 estándar
Solo cambian tres caracteres. Todo lo demás, incluida la regla de 3 bytes por cada 4 caracteres, sigue igual:
| Base64 estándar | Base64URL | |
|---|---|---|
| Valor 62 | + | - |
| Valor 63 | / | _ |
| Relleno | = obligatorio | normalmente se omite |
| Definido en | RFC 4648, sección 4 | RFC 4648, sección 5 |
En muchas cadenas cortas, las dos variantes solo se distinguen por el relleno. La diferencia de alfabeto aparece cuando un grupo de 6 bits vale 62 o 63, algo que producen caracteres como ? y > y muchos bytes no ASCII:
| Entrada | Estándar | Base64URL, sin relleno |
|---|---|---|
Hi! | SGkh | SGkh |
?>?> | Pz4/Pg== | Pz4_Pg |
subjects?_d | c3ViamVjdHM/X2Q= | c3ViamVjdHM_X2Q |
https://example.com/?q=1 | aHR0cHM6Ly9leGFtcGxlLmNvbS8/cT0x | aHR0cHM6Ly9leGFtcGxlLmNvbS8_cT0x |
Base64 frente a Base64URL cuenta la historia y las diferencias al decodificar con más detalle.
Por qué las URL necesitan su propio alfabeto
Cada uno de los tres caracteres estándar significa algo en una URL. / separa segmentos de la ruta, = separa nombres de valores en una query string, y los decodificadores de formularios leen + como un espacio. Un valor Base64 estándar como a+b/c== en un parámetro de consulta llega como a b/c== salvo que se escape cada carácter. La codificación con porcentajes lo arregla, pero convierte cada uno en tres caracteres (%2B, %2F, %3D).
Base64URL elige dos caracteres que no están reservados en las URL y quita el relleno, así que un valor se puede pegar sin cambios en una ruta, una query string, un fragmento, una cookie o un nombre de archivo. - y _ también son seguros en nombres de archivo en todos los sistemas de archivos habituales, a diferencia de /.
Dónde se usa Base64URL
- JWT y JOSE. Todas las partes de un JSON Web Token son Base64URL sin relleno, según el RFC 7515. El decodificador JWT lee tokens; Base64 en JWT explica la estructura.
- PKCE de OAuth. El
code_challengees el Base64URL del hash SHA-256 delcode_verifier. - WebAuthn y passkeys. Los ID de credenciales y los desafíos viajan como Base64URL dentro de JSON.
- Enlaces e ID. Los enlaces para compartir, los parámetros de URL firmados y los ID cortos generados a partir de bytes aleatorios lo usan para que la URL quede limpia.
Base64URL en código
Node.js tiene una codificación base64url integrada, y Python una función URL-safe a la que tienes que quitarle tú el relleno:
// Node.js
Buffer.from("subjects?_d").toString("base64url"); // "c3ViamVjdHM_X2Q"
// Browsers with Uint8Array.prototype.toBase64
new TextEncoder().encode("subjects?_d").toBase64({ alphabet: "base64url", omitPadding: true });
import base64, hashlib
base64.urlsafe_b64encode(b"subjects?_d").rstrip(b"=").decode() # 'c3ViamVjdHM_X2Q'
# PKCE code_challenge, example from RFC 7636 appendix B
verifier = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
digest = hashlib.sha256(verifier.encode("ascii")).digest()
base64.urlsafe_b64encode(digest).rstrip(b"=").decode()
# 'E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM'
Más en Base64 en Node.js, JavaScript y Python, y la API del navegador en Uint8Array.toBase64.
Preguntas frecuentes
¿Qué es Base64URL?
La variante de Base64 segura para URL y nombres de archivo definida en el RFC 4648, sección 5. Usa - y _ como los dos últimos caracteres del alfabeto en lugar de + y /, y normalmente se escribe sin relleno =.
¿Por qué no codificar con porcentajes el Base64 normal?
Funciona, pero cuesta tres caracteres por cada +, / e =, y un escape olvidado convierte el + en un espacio al analizar la query string. Base64URL evita los dos problemas.
¿Debo conservar el relleno =?
JWT y la mayoría de los formatos URL-safe lo omiten, porque el = también hay que escaparlo en las URL y el decodificador puede deducir el relleno a partir de la longitud. Consérvalo solo si el sistema receptor lo exige: desmarca Sin relleno.
¿Cómo genero un code_challenge de PKCE?
Calcula el SHA-256 del code_verifier y codifica en Base64URL los 32 bytes del hash, sin relleno. Esta página codifica texto, no bytes de un hash, así que hazlo en código; el fragmento de abajo reproduce el ejemplo del RFC 7636.