Cómo convertir Base64URL a Base64
- Pega el Base64URL en Entrada · Base64URL. El relleno es opcional, y los
+y/estándar en la entrada tampoco son problema. - El Base64 estándar aparece en Salida · Base64, con
-y_convertidos en+y/y el relleno restaurado. - Bajo la salida, Relleno (=) está activado por defecto; Ajuste de línea puede cortar el resultado a 64 caracteres para PEM o a 76 para MIME.
- Usa Copiar salida. El selector Base64 → Base64URL, o Base64 a Base64URL, hace la conversión contraria.
Cuánto relleno añadir
Base64 trabaja en grupos de 4 caracteres. Base64URL suele quitar los signos = que completan el último grupo, así que la longitud te dice cuántos hay que devolver:
| Longitud mod 4 | Relleno que añadir | Ejemplo |
|---|---|---|
| 0 | ninguno | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 (36 caracteres) |
| 2 | == | PDw_Pz8-Pg (10) se convierte en PDw/Pz8+Pg== |
| 3 | = | eyJyb2xlIjoiYWRtaW4-In0 (23) se convierte en eyJyb2xlIjoiYWRtaW4+In0= |
| 1 | no válido | un único carácter sobrante no puede contener un byte entero |
El conocido payload de ejemplo eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ tiene 70 caracteres, resto 2, así que se convierte en la misma cadena con == al final. La guía del relleno tiene el razonamiento completo.
Por qué podrías necesitar Base64 estándar
Muchos decodificadores solo aceptan el alfabeto estándar, y fallan de maneras distintas cuando reciben Base64URL:
- GNU coreutils
base64 -dimprime lo que haya decodificado hasta el primer-o_y despuésbase64: invalid input. - Java
Base64.getDecoder()lanzaIllegalArgumentException;Base64.getUrlDecoder()es el adecuado para entradas URL-safe. - .NET
Convert.FromBase64Stringlanza unaFormatExceptionante-,_o un=que falta. - Python
base64.b64decodees el peligroso: por defecto descarta sin error los caracteres que no pertenecen al alfabeto estándar.b64decode("PDw_Pz8-Pg==")devuelveb'<<\x0f\xcf\xc3\xe0'en lugar deb'<<???>>'.
El último caso merece una prueba en cualquier código que maneje tokens. Unos bytes erróneos sin excepción suelen aflorar mucho después, como una verificación de firma fallida o datos corruptos.
Base64URL a Base64 en código
import base64
def b64url_to_bytes(s: str) -> bytes:
return base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))
b64url_to_bytes("PDw_Pz8-Pg") # b'<<???>>'
base64.b64encode(b64url_to_bytes("PDw_Pz8-Pg")).decode() # 'PDw/Pz8+Pg=='
-len(s) % 4 es el número de signos = que faltan: 0, 1 o 2 en una entrada válida. urlsafe_b64decode necesita el relleno, y por eso se añade antes de la llamada.
function b64urlToB64(s) {
const b = s.replace(/-/g, "+").replace(/_/g, "/");
return b + "=".repeat((4 - (b.length % 4)) % 4);
}
b64urlToB64("PDw_Pz8-Pg"); // 'PDw/Pz8+Pg=='
En Node.js, Buffer.from(s, "base64url").toString("base64") hace lo mismo en una sola llamada. Consulta las páginas de Python, Java y C# para ver los decodificadores URL-safe de cada biblioteca estándar.
Problemas habituales
- “el último grupo de caracteres está incompleto”. La longitud deja un resto de 1. Se perdió parte de la cadena, a menudo en un salto de línea o porque la URL se truncó.
- Un
.en la entrada. Los JWT unen tres segmentos Base64URL con puntos. Convierte los segmentos de uno en uno; el decodificador JWT acepta el token entero. %3Den la cadena. El valor se codificó con porcentajes encima del Base64URL. Decodifícalo antes con decodificar URL.
Preguntas frecuentes
¿Cómo vuelvo a añadir el relleno a un Base64URL?
Rellena el final con = hasta llegar a un múltiplo de 4 caracteres: dos signos para un resto de 2 y uno para un resto de 3. Un resto de 1 no puede darse en datos válidos. Este convertidor lo hace por ti.
¿Por qué falla base64 -d con un JWT?
El base64 -d de GNU solo conoce el alfabeto estándar y se detiene con invalid input en el primer - o _. Convierte antes el segmento aquí, o usa basenc --base64url -d, que lee el alfabeto URL-safe.
¿Y si a la cadena le sobra un carácter?
Una cadena Base64URL cuya longitud deja un resto de 1 al dividirla entre 4 está cortada o tiene un carácter de más. El convertidor avisa de que el último grupo está incompleto; revisa cómo se copió el valor.
¿Necesito Base64 estándar para leer un JWT?
No en este sitio: el decodificador JWT y el decodificador Base64URL leen Base64URL directamente. Convierte a Base64 estándar cuando otra herramienta o biblioteca solo acepte esa forma.