Generador TOTP
Introduce una clave secreta Base32 para ver el código actual de autenticación en dos pasos con una cuenta regresiva en vivo, o genera un nuevo secreto y un código QR otpauth para tu app o servidor. Los códigos se calculan con el algoritmo RFC 6238 íntegramente en tu navegador.
Última actualización:
- Anterior
- ------
- Siguiente
- ------
Cómo usar Generador TOTP
- Pega tu clave secreta (el texto Base32 que aparece debajo del código QR al configurar la 2FA) o un enlace otpauth:// completo. Los espacios y las minúsculas no son problema.
- Ajusta la configuración según el servicio: casi todos usan SHA-1, 6 dígitos y 30 segundos.
- Lee el código antes de que se acabe el anillo, o pulsa Copiar código.
- Para configurar la 2FA en tu propia app, pulsa Generar secreto, introduce el emisor y el nombre de la cuenta, y escanea el código QR con una app de autenticación.
- Comprueba un código escribiéndolo en Verificar un código; la herramienta acepta el paso de tiempo anterior y el siguiente para tolerar el desfase del reloj.
Cómo se calcula un código TOTP
TOTP (RFC 6238) es HOTP (RFC 4226) con la hora actual como contador:
- Contador: T = floor((tiempo Unix − T0) / periodo), con T0 = 0 y periodo = 30 segundos de forma predeterminada.
- HMAC: calcula el HMAC-SHA1 (o SHA-256 / SHA-512) de T, escrito como un número big-endian de 8 bytes, usando la clave secreta decodificada.
- Truncamiento dinámico: toma los 4 bits bajos del último byte como desplazamiento, lee 4 bytes desde ese desplazamiento y borra el bit superior para obtener un número de 31 bits.
- Código: ese número mod 10dígitos, rellenado con ceros a la izquierda (por ejemplo, 1,234,567,890 mod 106 = 567890).
Como solo se necesitan la hora y el secreto compartido, los códigos funcionan sin conexión y caducan automáticamente. Puedes confirmar tu implementación con los vectores de prueba de RFC 6238: con el secreto ASCII 12345678901234567890 (Base32 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ), SHA-1, 8 dígitos y tiempo Unix 59, el código es 94287082; en el tiempo 1111111109 es 07081804.
El formato de URI de clave otpauth://
Las apps de autenticación importan cuentas desde un código QR que contiene un URI como este:
otpauth://totp/Example:[email protected]?secret=JBSWY3DPEHPK3PXP&issuer=Example&algorithm=SHA1&digits=6&period=30
| Parte | Significado | Predeterminado |
|---|---|---|
totp | Tipo: basado en el tiempo (hotp se basa en un contador) | obligatorio |
| Etiqueta | Issuer:account, se muestra en la app; codificado para URL | obligatorio |
secret | Clave compartida en Base32, sin relleno | obligatorio |
issuer | Nombre del servicio; debe coincidir con el prefijo de la etiqueta | recomendado |
algorithm | SHA1, SHA256 o SHA512 | SHA1 |
digits | Longitud del código, 6 u 8 (algunas apps aceptan 7) | 6 |
period | Segundos por código | 30 |
Consejos para desarrolladores que añaden 2FA
- Genera un secreto aleatorio nuevo para cada usuario (al menos 160 bits) y guárdalo cifrado en el servidor.
- Acepta el paso de tiempo anterior y el siguiente (±30 segundos) para tolerar el desfase del reloj, pero recuerda qué contador se usó por última vez y rechaza un código que se use dos veces.
- Limita la frecuencia de intentos: un código de 6 dígitos solo tiene un millón de posibilidades.
- Ofrece códigos de recuperación cuando los usuarios activen la 2FA, por si pierden el teléfono.
Preguntas frecuentes
¿Qué es un código TOTP?
Una contraseña de un solo uso basada en el tiempo (Time-based One-Time Password, RFC 6238) es un código corto que cambia cada 30 segundos. Se calcula como HMAC(secreto, floor(tiempo Unix / 30)) y luego se trunca a 6 dígitos como se describe en RFC 4226. Tu teléfono y el servidor comparten el mismo secreto, así que ambos calculan el mismo código sin ninguna conexión de red.
¿Por qué mi código es distinto al de mi app de autenticación?
Comprueba tres cosas: el secreto debe ser exactamente la misma clave Base32, la configuración (algoritmo, dígitos, periodo) debe coincidir y los relojes deben estar de acuerdo. TOTP depende de la hora, así que un reloj de computadora o teléfono desfasado más de unos 30 segundos da un código distinto. Activa la sincronización automática de la hora.
¿Es seguro introducir aquí mi secreto 2FA?
El código se calcula localmente con la API WebCrypto del navegador. El secreto no se sube, no se registra ni se guarda. Aun así, cualquiera que tenga tu secreto puede generar tus códigos, así que trátalo como una contraseña y usa esta herramienta solo en un dispositivo de confianza. Para los inicios de sesión diarios, usa una app de autenticación.
¿Qué longitud debe tener un secreto TOTP?
RFC 4226 exige al menos 128 bits y recomienda 160 bits, que son 32 caracteres Base32. El botón Generar secreto crea 160 bits aleatorios con crypto.getRandomValues. Los secretos más cortos, como los de 16 caracteres (80 bits), siguen funcionando en la mayoría de las apps, pero son más débiles.
¿Qué apps pueden escanear el código QR?
Cualquier app compatible con el formato de URI de clave otpauth://, como Google Authenticator, Microsoft Authenticator, Authy, 1Password, Bitwarden, FreeOTP y Aegis. Algunas apps ignoran los ajustes no predeterminados, así que SHA-1, 6 dígitos y 30 segundos es la opción más compatible.
¿Qué significa el valor del contador?
El contador T es el número de periodos completos desde el 1 de enero de 1970 UTC, floor(tiempo Unix / periodo). Es el mensaje que se firma con HMAC. Los desarrolladores pueden compararlo con su propia implementación al depurar.
¿Puedo usarlo para códigos HOTP (basados en contador)?
Esta herramienta genera códigos basados en el tiempo. HOTP usa el mismo HMAC y el mismo truncamiento, pero con un contador que aumenta en cada inicio de sesión en lugar del reloj, así que los enlaces otpauth://hotp no son compatibles aquí.
¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?
Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.