Cómo decodificar Base32
- Pega la cadena en Entrada · Base32 (RFC 4648). Se aceptan mayúsculas o minúsculas, espacios entre grupos y saltos de línea, y el relleno
=es opcional. - Lee el texto decodificado en Salida · Texto. El juego de caracteres por defecto es UTF-8; cambia el Juego de caracteres bajo la salida si el texto viene de otro sistema.
- Si la salida es un revoltijo de símbolos, los datos son binarios. Pon A en Hex o Base64 para ver los bytes, o haz clic en Guardar bytes para descargarlos como archivo.
- Si la entrada usa otro alfabeto, cambia De a Base32hex, Crockford Base32 o z-base-32.
- Para codificar, haz clic en Texto → Base32 (RFC 4648) en el selector de dirección, o usa el codificador Base32.
Qué acepta y qué rechaza el decodificador
El decodificador es flexible con el formato y estricto con el contenido:
| Entrada | Resultado |
|---|---|
JBSWY3DP | Hello |
jbswy3dp | Hello; da igual mayúsculas o minúsculas |
JBSW Y3DP EHPK 3PXP | 10 bytes, 48656c6c6f21deadbeef en hex |
MZXW6YQ | foob; la falta de relleno no importa |
JBSWY3D0 | Error: carácter inesperado "0" en la posición 8 |
El error señala el primer carácter que no pertenece al alfabeto. Un 0, 1, 8 o 9 casi siempre significa que la cadena usa otro alfabeto Base32, y un + o / significa que en realidad es Base64; prueba el decodificador Base64.
Decodificar un secreto 2FA o TOTP
La clave que muestra una app de autenticación durante la configuración, a menudo agrupada como jbsw y3dp ehpk 3pxp, es Base32 RFC 4648. Al decodificarla obtienes la clave HMAC en bruto, que son bytes aleatorios, así que mírala como Hex y no como Texto. La longitud indica el tamaño de la clave: 16 caracteres son 10 bytes, 32 caracteres son 20 bytes (160 bits, el tamaño que recomienda RFC 4226) y 52 caracteres son 32 bytes.
Para comprobar que tienes el secreto correcto, genera un código con él. Esta función de Python decodifica el secreto con la misma flexibilidad y luego sigue RFC 6238:
import base64, hashlib, hmac, struct
def totp(secret, t, digits=6, step=30):
s = secret.replace(" ", "").upper()
key = base64.b32decode(s + "=" * (-len(s) % 8))
mac = hmac.new(key, struct.pack(">Q", t // step), hashlib.sha1).digest()
off = mac[-1] & 0x0F
code = struct.unpack(">I", mac[off:off + 4])[0] & 0x7FFFFFFF
return str(code % 10**digits).zfill(digits)
totp("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ", 59, 8) # '94287082'
El secreto y el resultado esperado 94287082 son el vector de prueba SHA-1 de RFC 6238. Para el código actual, pasa int(time.time()) como t. Hay más patrones de decodificación en la página de Python.
CIDv1 de IPFS y otros Base32 con prefijo
Algunos formatos ponen un marcador delante del Base32. Las cadenas CIDv1 de IPFS empiezan por b, el código multibase de Base32 RFC 4648 en minúsculas sin relleno: en bafybei… la b es el prefijo y afybei… son los datos. Quita la b, decodifica y pon A en Hex. Los primeros bytes son la versión del CID (01), el tipo de contenido (70 para dag-pb) y la cabecera multihash (1220 para un SHA-256 de 32 bytes).
Las direcciones onion v3 de Tor funcionan igual, pero sin prefijo: los 56 caracteres antes de .onion son el Base32 de 35 bytes, una clave pública de 32 bytes, una suma de comprobación de 2 bytes y un byte de versión (03).
Problemas habituales
- Python lanza
binascii.Error: Non-base32 digit found. La entrada está en minúsculas. Pasacasefold=Trueab32decode, o llama antes a.upper(). - Python lanza
binascii.Error: Incorrect padding. Se quitaron los signos=. Completa la longitud hasta un múltiplo de 8, como en la función de arriba. base32 -ddiceinvalid input. GNU coreutils no acepta ni minúsculas ni espacios. Limpia antes la cadena o decodifícala aquí.- El texto se decodifica, pero sale otra cosa. Las cadenas base32hex y Crockford se decodifican sin error con el alfabeto equivocado. Si la fuente dice «Base32» pero la cadena no tiene
0,1,8ni9, RFC 4648 sigue siendo la mejor apuesta; si los tiene, prueba los otros dos.
Preguntas frecuentes
¿Cómo decodifico un secreto TOTP?
Pega el secreto (el valor secret= de un enlace otpauth://, o la clave en texto que muestra la app en lugar del código QR) y pon A en Hex. El resultado es la clave HMAC en bruto. Son bytes aleatorios, así que la salida Texto parecerá basura, y es lo esperado.
¿Por qué Python dice Incorrect padding al decodificar Base32?
base64.b32decode quiere que la longitud sea múltiplo de 8. Añade antes los = que faltan: s + "=" * (-len(s) % 8). Este decodificador no necesita relleno.
¿Puedo decodificar un ULID aquí?
No directamente. Un ULID usa el alfabeto Crockford, pero codifica un único número de 128 bits en 26 caracteres, que empieza con 2 bits sobrantes. La opción Crockford de aquí empaqueta los bits de los bytes desde el primer carácter, así que con un ULID devuelve bytes desplazados.
¿Qué caracteres no son válidos en Base32?
En Base32 RFC 4648, todo lo que no sea A–Z, 2–7 y el = final. Los dígitos 0, 1, 8 y 9 suelen indicar que la cadena es base32hex o Crockford; cambia De para probarlos.