Cómo convertir Base64 a Base32
- Pega el Base64 en Entrada · Base64. Se admiten caracteres URL-safe (
-,_), relleno ausente y saltos de línea. - Lee el resultado en Salida · Base32 (RFC 4648).
- Para un enlace
otpauth://o una app autenticadora, desmarca Relleno (=) bajo la salida. - Haz clic en Copiar salida. Base32 (RFC 4648) → Base64 en el selector de dirección convierte en sentido contrario, igual que la página Base32 a Base64.
Los bytes intermedios no cambian. Entra una clave de 20 bytes y sale una clave de 20 bytes, como muestra el contador Bytes bajo la herramienta.
Ejemplos
| Base64 | Base32 | Bytes |
|---|---|---|
iEwO+V01Llzjb4MxBUtgEuCNW8o= | RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K | 20 |
iEwO-V01Llzjb4MxBUtgEuCNW8o | RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K | 20, entrada URL-safe y sin relleno |
MTIzNDU2Nzg5MDEyMzQ1Njc4OTA= | GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ | 20, el secreto de prueba de RFC 6238 |
SGVsbG8h3q2+7w== | JBSWY3DPEHPK3PXP | 10 |
Las dos cadenas de las primeras filas no se parecen en nada, y es normal: Base64 usa 6 bits por carácter y Base32 usa 5, así que los caracteres nunca coinciden.
El error que hay que evitar es codificar los caracteres Base64 como texto. Si pegas iEwO+V01Llzjb4MxBUtgEuCNW8o= en un codificador de texto a Base32 obtienes NFCXOTZLKYYDCTDM…, que es Base32 válido, pero de los propios 28 caracteres. Los códigos del autenticador generados con eso nunca coincidirán con los del servidor.
Configurar TOTP a partir de un secreto Base64
El código del servidor suele guardar el secreto compartido en Base64, o lo genera con un comando como este:
openssl rand -base64 20
Para darlo de alta en una app autenticadora, conviértelo aquí y construye la URI de clave:
otpauth://totp/Example:alice@example.com?secret=RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K&issuer=Example
algorithm, digits y period se pueden añadir como parámetros; sin ellos, las apps asumen SHA-1, 6 dígitos y 30 segundos. Convierte el enlace en un código QR con cualquier herramienta QR local, o deja que el usuario teclee a mano el secreto Base32. El secreto son los mismos bytes que tu servidor pasa a HMAC, así que los códigos coinciden sin tocar el servidor.
Si necesitas un secreto nuevo en lugar de uno existente, genera 20 bytes aleatorios en Base64 con el generador de Base64 aleatorio (ajuste Personalizado) y conviértelos aquí.
Longitudes para tamaños de clave habituales
| Clave | Base64 | Base32, sin relleno | Base32 con = |
|---|---|---|---|
| 10 bytes (80 bits) | 16 | 16 | 16 |
| 16 bytes (128 bits) | 24 | 26 | 32 |
| 20 bytes (160 bits) | 28 | 32 | 32 |
| 32 bytes (256 bits) | 44 | 52 | 56 |
Los tamaños múltiplos de 5 bytes, como 10 y 20, dan Base32 sin ningún relleno.
La misma conversión en Python
import base64
secret_b64 = "iEwO+V01Llzjb4MxBUtgEuCNW8o="
base64.b32encode(base64.b64decode(secret_b64)).decode().rstrip("=")
# 'RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K'
Para entrada URL-safe usa base64.urlsafe_b64decode, y añade antes el relleno = si se eliminó. Más sobre esto en Base64 en Python.
Preguntas frecuentes
¿Por qué las apps autenticadoras necesitan Base32 y no Base64?
El formato de URI de clave otpauth://, que las apps leen de los códigos QR, define el secreto en Base32. Además tiene que poder teclearse cuando el QR no se puede escanear, y Base32 no tiene +, / ni mezcla de mayúsculas y minúsculas con las que equivocarse.
¿El secreto Base32 debe llevar relleno =?
En un enlace otpauth://, no: el formato de URI de clave indica que el relleno debe omitirse. Desmarca Relleno (=). Un secreto de 20 bytes ocupa 32 caracteres y de todos modos no necesita relleno.
¿Qué longitud debe tener un secreto TOTP?
RFC 4226 exige al menos 128 bits y recomienda 160 bits, es decir, 20 bytes: 28 caracteres Base64 o 32 caracteres Base32.
¿Convertir un secreto a Base32 supone un riesgo de seguridad?
La codificación no añade ni quita protección; cualquiera que tenga la cadena en cualquiera de las dos formas puede generar tus códigos. El riesgo está en dónde la pegas. Esta página la convierte en el navegador y su Content Security Policy bloquea las peticiones de red que no sean las del contador de visitas de Cloudflare.