Cómo convertir Base64 a Base64URL
- Pega el Base64 en Entrada · Base64. Los saltos de línea del Base64 ajustado y un prefijo
data:...;base64,se eliminan automáticamente. - La cadena URL-safe aparece en Salida · Base64URL.
- Marca Relleno (=) bajo la salida si el receptor quiere conservar el
=final. - Usa Copiar salida. El selector Base64URL → Base64, o Base64URL a Base64, hace la conversión inversa.
La entrada se decodifica a bytes y se vuelve a codificar, así que una cadena que no es Base64 válido da un error en lugar de un resultado convertido a medias.
Ejemplos
| Base64 | Base64URL | Nota |
|---|---|---|
PDw/Pz8+Pg== | PDw_Pz8-Pg | / y + sustituidos, == eliminado |
eyJyb2xlIjoiYWRtaW4+In0= | eyJyb2xlIjoiYWRtaW4-In0 | JSON con un >, un = eliminado |
E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw+cM= | E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM | el challenge PKCE de RFC 7636, apéndice B |
+/8= | -_8 | los bytes fb ff |
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | sin cambios: no hay +, / ni = |
La última fila es habitual. El JSON corto y el texto ASCII a menudo se codifican sin + ni /, y cuando la longitud es múltiplo de 3 bytes tampoco hay relleno, así que las dos formas son idénticas. Por eso también una conversión olvidada puede pasar desapercibida en las pruebas hasta que algún valor produce un + o un /.
Caracteres del Base64 estándar que rompen las URL
Tres caracteres del Base64 estándar tienen un significado especial en las URL:
+significa espacio en las query strings, así que?t=a+bllega comoa ben muchos frameworks./separa segmentos de ruta, así que un Base64 en la ruta puede partirse o enrutarse mal.=separa el nombre de un parámetro de su valor y hay que escribirlo como%3Dpara ir sobre seguro.
La sección 5 de RFC 4648 define Base64URL para este caso, con - y _ en lugar de + y / y un relleno que se puede omitir. Estos valores no necesitan escapes en rutas, query strings, cookies ni nombres de archivo. El artículo Base64 frente a Base64URL entra en detalle.
Dónde se exige Base64URL
- JWT y JWS. Los tres segmentos de un JSON Web Token usan Base64URL sin relleno. El decodificador JWT los lee, y Base64 en JWT explica el formato.
- OAuth PKCE. Las herramientas de hash suelen imprimir el digest SHA-256 del verificador en Base64 estándar, mientras que
code_challengedebe ser ese digest en Base64URL sin relleno. Esta conversión es el último paso. - WebAuthn y JWK. Los ID de credencial, los challenges y los parámetros de clave de una JSON Web Key son Base64URL.
- URL firmadas y tokens en enlaces, como los de restablecer contraseña o de descarga, donde el valor va en una ruta o en una query string.
Para codificar texto directamente a Base64URL sin pasar por la forma estándar, usa el codificador Base64URL.
Base64 a Base64URL en código
import base64
base64.urlsafe_b64encode(b"<<???>>").rstrip(b"=").decode() # 'PDw_Pz8-Pg'
Buffer.from("PDw/Pz8+Pg==", "base64").toString("base64url"); // 'PDw_Pz8-Pg'
"PDw/Pz8+Pg==".replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); // same, without Buffer
urlsafe_b64encode de Python mantiene el relleno, de ahí el rstrip. La codificación "base64url" de Node lo elimina. Más en las guías de Python y Node.js.
Preguntas frecuentes
¿Convertir a Base64URL cambia los datos?
No. Ambos alfabetos codifican los mismos bytes; solo cambian dos caracteres y el relleno. Al decodificar cualquiera de las dos formas obtienes bytes idénticos.
¿Debo quitar el relleno = al convertir?
Haz lo que pida el receptor. Los JWT (RFC 7515) y PKCE (RFC 7636) exigen no usar relleno. Algunas bibliotecas aceptan ambas formas, y unos pocos decodificadores antiguos lo exigen; en ese caso marca Relleno (=).
¿Puedo convertir Base64 a Base64URL con una expresión regular?
Sí: s.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "") en JavaScript. Supone que la entrada es una sola línea limpia; si viene de un archivo PEM o de un correo, quita antes los saltos de línea.
¿Sirve codificar con porcentajes el Base64 estándar?
Funciona, pero +, / y = se convierten en %2B, %2F y %3D, tres caracteres cada uno, y el valor sigue rompiéndose en sistemas que decodifican la URL dos veces o leen + como un espacio. Base64URL no tiene ninguno de los dos problemas.