Generador TOTP / HOTP 2FA
CifradoGenera contraseñas de un solo uso basadas en tiempo (TOTP) o en contador (HOTP) a partir de un secreto Base32 o un URI otpauth://. Cuenta regresiva en vivo y código QR escaneable — todo localmente en tu navegador.
No se recuperan URLs remotas; pega tu JSON directamente.
Escanea con Google Authenticator, Authy, 1Password o cualquier app TOTP.
En esta página
¿Qué es un TOTP?#
Una contraseña de un solo uso basada en tiempo (TOTP) es el código rotatorio de 6 dígitos que tu app de autenticación muestra junto a cada cuenta. Por debajo es un HMAC: el secreto compartido y la ventana de tiempo actual se hashean juntos, y el resultado se trunca a un código numérico corto. Como el código depende del reloj, se renueva solo cada 30 segundos, lo que hace que «algo que tienes» (el secreto) sea utilizable como segundo factor sin ningún round-trip de red entre tu teléfono y el servicio.
Esta página es un generador de TOTP y HOTP plenamente funcional. TOTP deriva el código de la hora actual y se refresca solo conforme transcurre el periodo; HOTP lo deriva de un contador que avanza en cada uso. Puedes teclear un secreto Base32 directamente, o pegar un URI otpauth:// (la cadena codificada en los códigos QR que los servicios te muestran al activar el 2FA) y que todos los campos se rellenen automáticamente. La página también emite el URI canónico otpauth:// y renderiza un código QR escaneable, así puedes aprovisionar una cuenta nueva en una app de teléfono directamente desde aquí.
Todo se ejecuta localmente: el secreto nunca sale de la página y no hay ninguna llamada en línea a ningún servicio de autenticación.
Cómo usarlo#
- Elige un modo: TOTP (basado en tiempo, se refresca solo) o HOTP (basado en contador, avanza manualmente).
- Proporciona el secreto. Pega el secreto Base32 en el campo de secreto, o pega un URI
otpauth://en el campo URI para autorrellenar todos los parámetros a la vez. - Ajusta el emisor y la etiqueta de cuenta (solo afectan a cómo se nombra la entrada en una app de autenticación, no al código en sí).
- Elige el algoritmo (SHA-1 / SHA-256 / SHA-512; SHA-1 es el valor por defecto universal), los dígitos (6 / 7 / 8; 6 es el estándar) y, para TOTP, el periodo en segundos (por defecto 30). Para HOTP, ajusta el contador y pulsa +1 (Código siguiente) para avanzarlo tras cada uso.
- Pulsa Generar. El código aparece en grande con un anillo de cuenta atrás que muestra los segundos que quedan en el periodo actual; debajo, el URI
otpauth://y un código QR escaneable.
Características principales#
- TOTP y HOTP en un solo sitio. Alterna entre la variante basada en tiempo y la basada en contador sin reintroducir el secreto.
- Manejo tolerante de Base32. Se limpian automáticamente espacios, guiones, minúsculas y caracteres extraños, así los secretos copiados de formatos incómodos siguen funcionando.
- Importación y exportación de URI. Pega un URI
otpauth://para rellenar todos los campos, o copia el URI generado para aprovisionar una cuenta nueva en otro sitio. - Código QR en vivo. Renderizado en la página a partir del URI, listo para escanear en cualquier app de autenticación.
- Anillo de cuenta atrás. Una cuenta atrás visual hasta el siguiente giro, para que sepas si al código que vas a teclear le queda bastante tiempo.
- Cero subidas. La generación, el análisis y el renderizado del QR son todos locales; el secreto nunca se transmite.
Ejemplo detallado#
La semilla de referencia de RFC 6238 es la cadena ASCII 12345678901234567890, que en Base32 es GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ. Escribe ese secreto, pon dígitos 8 y periodo 30, y los codes coinciden con los vectores de prueba publicados exactamente:
- SHA-1 en el tiempo = 59 segundos desde el origen de época →
94287082 - SHA-256 en el mismo instante →
46119246 - SHA-512 en el mismo instante →
90693936
En el tiempo = 1111111109 (una fecha muy en el futuro), SHA-1 produce 07081804. Estos son los mismos valores de respuesta conocida contra los que se comprueba la propia suite de tests de esta herramienta, así que son una forma fiable de confirmar que un generador es correcto. Para el 2FA de cada día, los servicios usan 6 dígitos, SHA-1 y un periodo de 30 segundos: vuelve a poner los dígitos en 6 y el mismo secreto produce el código rotatorio que mostraría una app de autenticación.
Preguntas frecuentes#
Mi código no coincide con el de mi app de teléfono. ¿Qué falla?#
Casi siempre el secreto o el reloj. Primero confirma que el secreto Base32 es idéntico: cópialo de nuevo desde la página de configuración del servicio, pues un solo carácter equivocado lo cambia todo. Después comprueba los parámetros: la mayoría de los servicios usan SHA-1, 6 dígitos y un periodo de 30 segundos; si el servicio usa SHA-256 u 8 dígitos y tú tienes SHA-1 / 6 seleccionados, los codes diferirán. Por último, asegúrate de que el reloj de tu dispositivo es correcto: TOTP tolera un pequeño desfase, pero más de unos 30 segundos de diferencia lo romperá.
¿Cuál es la diferencia entre TOTP y HOTP?#
TOTP usa la hora actual como factor móvil, así que avanza automáticamente cada periodo. HOTP usa un contador simple que se incrementa cada vez que se consume un código, así que ambos lados deben mantenerse sincronizados sobre cuántos códigos se han usado. TOTP es lo que usa hoy casi todo flujo de 2FA de consumo, porque no necesita sincronización más allá del reloj.
¿Es seguro poner mi secreto en una página web?#
El secreto nunca sale de esta página: la generación, el análisis y el renderizado del QR se ejecutan localmente en tu navegador, sin llamada de red. Dicho eso, para un secreto de 2FA de producción que tú controlas, la práctica más segura es generarlo y almacenarlo en un entorno en el que confíes plenamente, no en cualquier página web, y conservar los códigos de recuperación que te dio el servicio.
¿Por qué pegar mi URI otpauth:// lo rellena todo?#
Ese URI es el formato estándar que intercambian las apps de autenticación: codifica el tipo, el emisor, la cuenta, el secreto, el algoritmo, los dígitos y el periodo (o contador) en una sola cadena. El analizador lee esos campos y rellena el formulario, justo lo que ocurre cuando escaneas un código QR con tu teléfono: el QR no es más que ese URI renderizado como imagen.