Generador de Código TOTP / 2FA
Generador online gratis de códigos TOTP / 2FA (RFC 6238). Pega un secret Base32 para ver el código actual y el siguiente, escanea el QR con Google Authenticator y valida tu 2FA.
Generador de Código TOTP / 2FA (RFC 6238)
Genera contraseñas de un solo uso basadas en tiempo (TOTP) totalmente en tu navegador. Pega cualquier secret Base32 — el que Google Authenticator, Authy, Microsoft Authenticator y 1Password importan — y mira en vivo el código de 6 dígitos, el siguiente, un anillo de cuenta atrás, la URI otpauth:// y un QR escaneable desde cualquier app authenticator. Implementa RFC 6238 con exactitud, verificado contra los seis vectores oficiales de prueba. Útil para depurar configuraciones 2FA, validar generación en el servidor o tener un authenticator offline.
¿Qué es TOTP y en qué se diferencia de HOTP?
TOTP (Time-based One-Time Password, RFC 6238) genera un código de 6 a 8 dígitos que cambia cada 30 segundos. Es el algoritmo detrás de Google Authenticator, Microsoft Authenticator, Authy, OTP integrado de 1Password, FreeOTP y decenas de apps más.
Se basa en HOTP (HMAC-based One-Time Password, RFC 4226):
- HOTP usa un contador que aumenta en 1 cada vez que pulsas un botón o usas un código.
- TOTP usa el tiempo Unix actual dividido por un periodo (30 s por defecto) como contador. En T = floor(time / 30), el valor del código es idéntico para todos los que comparten el secret.
Ambos producen el código calculando HMAC(secret, contador) y truncando. TOTP es más práctico porque no requiere sincronización entre cliente y servidor más allá de relojes razonablemente precisos (nivel NTP basta).
¿Qué calcula realmente esta herramienta?
Exactamente lo que dicta RFC 6238 — verificado con los vectores oficiales del Anexo B:
1. Decodifica el secret Base32 a bytes.
2. Calcula contador = floor(unix_time / period) y lo empaqueta en 8 bytes big-endian.
3. Calcula HMAC sobre esos 8 bytes con el algoritmo elegido (SHA-1, SHA-256 o SHA-512) y el secret.
4. Truncamiento dinámico: toma los 4 bits finales del HMAC como offset, lee 4 bytes desde ahí, enmascara el bit alto.
5. Devuelve (bin % 10^digits), rellenado con ceros al ancho elegido.
El paso HMAC usa Web Crypto SubtleCrypto del navegador, por lo que la criptografía es nativa y auditada; esta herramienta solo cablea el protocolo. Los seis vectores RFC (T = 59, 1111111109, 1111111111, 1234567890, 2000000000, 20000000000) coinciden con la salida esperada.
¿Cómo añado una cuenta nueva a Google Authenticator con esta herramienta?
Dos caminos según qué lado controles:
1. Tienes un servicio que generó el secret (cadena o QR). Pega el secret Base32 en el campo Secret, opcionalmente rellena 'Etiqueta de cuenta' (p. ej. [email protected]) y 'Emisor' (nombre del sitio) para que tu authenticator muestre un nombre legible. La herramienta enseña el código actual para comparar con el paso de verificación del servicio.
2. Estás creando un servicio y necesitas enrolar a un usuario. Pulsa el dado para generar un secret aleatorio Base32 de 20 bytes, rellena 'Etiqueta de cuenta' y 'Emisor'. El QR codifica una URI otpauth:// estándar — el usuario lo escanea en su app y empieza a producir códigos coincidentes al instante. Copia la URI otpauth:// para incrustarla en tu propio QR, o descarga el PNG renderizado.
En ambos flujos los códigos se generan localmente — nunca se transmiten — por lo que es seguro incluso con secrets de producción.
¿Es seguro pegar aquí mi secret 2FA real?
Técnicamente sí — todo corre en tu navegador — pero un secret TOTP Base32 es la credencial maestra de tu 2FA. Quien lo conozca produce los mismos códigos que tú. Trátalo como una contraseña:
- No lo pegues en navegadores en los que no confías (kioscos, máquinas compartidas, navegadores con extensiones poco fiables).
- Inspecciona DevTools → Red para confirmar que el secret nunca se envía por POST. No lo hace — pero la confirmación está a un clic.
- No dejes la página abierta donde alguien pueda leer el valor.
- Para la mayoría, el uso adecuado es probar o recuperar desde una copia (p. ej. guardaste el secret en la pantalla de configuración y perdiste la app); no como sustituto diario de una llave hardware.
Si generas un secret aleatorio con el dado, es seguro compartirlo libremente — pero cualquier secret de una cuenta real merece protección de contraseña.
¿Cuál es el formato de la URI otpauth://?
URI estilo RFC usada por todas las apps authenticator principales:
otpauth://totp/Emisor:[email protected]?secret=BASE32SECRET&issuer=Emisor&algorithm=SHA1&digits=6&period=30
Campos:
- El 'path' tras totp/ es la etiqueta, normalmente 'Emisor:Cuenta'. El prefijo Emisor es opcional pero recomendado; ambas copias deben coincidir con el parámetro issuer.
- secret: Base32, sin padding, mayúsculas preferidas.
- issuer: nombre legible del servicio (URL-encoded).
- algorithm: SHA1 (predeterminado), SHA256 o SHA512. Muchas apps solo soportan SHA1.
- digits: 6 (predeterminado), 7 u 8. Muchas apps solo soportan 6.
- period: 30 (predeterminado) segundos. Algunas apps permiten 60.
La herramienta solo añade parámetros distintos al predeterminado para mantener limpia la URI. Los authenticators toleran parámetros extra, pero la forma con defaults omitidos es la más portable.
¿Por qué a veces el código en la app está desfasado un paso?
TOTP depende de relojes razonablemente sincronizados a ambos lados. Si tu dispositivo se desvía más de unos segundos, tu código se calcula sobre un time-step distinto al del servidor.
Cómo lo manejan servicios y clientes:
- Los servidores suelen aceptar el código previo y el siguiente además del actual. Eso da una ventana de ~±30 s.
- Los clientes deben usar NTP. En Android, activa 'Usar hora proporcionada por la red'; en iOS, 'Establecer automáticamente' en Fecha y hora; en Linux/macOS, systemd-timesyncd o chrony mantienen el reloj con precisión de milisegundos.
- Authy y Google Authenticator ofrecen un botón 'sincronizar hora' en la app para tomar la hora de la red sin tocar el reloj del sistema.
Esta herramienta usa el reloj local (Date.now() del navegador). Si ambos relojes están correctos, los códigos coinciden; si uno se desvía más de 60 s, verás desajuste.
¿Qué algoritmo y longitud elijo?
Predeterminados: SHA-1, 6 dígitos, periodo 30 s. Razones para cambiarlos:
- SHA-1: el predeterminado universal. Todas las apps lo soportan. Recomendado salvo razón concreta.
- SHA-256 / SHA-512: HMAC más fuerte. Útil cuando tanto el servidor emisor como la app cliente lo soportan (Authy y 1Password sí; algunas versiones antiguas de Google Authenticator no renderizan correctamente SHA-256+).
- 6 dígitos: soporte universal, probabilidad ~1 entre un millón por intento.
- 7 / 8 dígitos: más fuerte; Yubico OATH los soporta; muchas apps solo muestran 6.
- 30 s: estándar. 60 s reduce la frecuencia de nuevos códigos y facilita anti-replay; 15 s es raro y rompe algunas apps.
Para compatibilidad: SHA-1 / 6 / 30. Para herramientas internas donde controlas ambos extremos, SHA-256 / 6 / 30 es una mejora razonable.
¿A dónde va el dato? ¿Funciona offline?
Tu secret nunca sale del navegador. El generador corre íntegramente en el cliente:
- HMAC se calcula con window.crypto.subtle, las mismas primitivas que usa HTTPS. No hay implementación JS de SHA-1 empaquetada.
- La renderización del QR usa la librería qrcode cargada una sola vez desde un CDN público (cdn.jsdelivr.net). Tras esa carga, la página funciona offline — incluida la generación. Desconecta el Wi-Fi y observa que sigue corriendo.
- No se hace analítica sobre tus entradas. Confírmalo abriendo DevTools → Red mientras tecleas; solo aparecen recursos estáticos.
- 'Copiar código' y 'Copiar URI' escriben en el portapapeles local. 'Descargar QR' crea un PNG en memoria y abre un diálogo local.
Para máximo uso offline, carga la página una vez en una máquina de confianza y luego corta la red. HMAC, decodificación base32, render del QR y portapapeles siguen funcionando — útil para servidores aislados o escenarios de recuperación.
Características Principales
- Cumple RFC 6238, verificado contra los seis vectores oficiales
- HMAC con Web Crypto API nativo del navegador (sin crypto JS empaquetado)
- Soporta SHA-1, SHA-256 y SHA-512
- Dígitos configurables (6 / 7 / 8) y periodo (15 / 30 / 60 segundos)
- Muestra en vivo el código actual y el siguiente
- Anillo de cuenta atrás animado con segundos restantes
- Generador de secret Base32 aleatorio de 20 bytes con crypto.getRandomValues
- URI otpauth:// compatible con Google Authenticator, Authy, 1Password, Microsoft Authenticator y más
- Genera un QR que escanea limpiamente en toda app authenticator
- Botón mostrar/ocultar para el campo de secret
- Copia código o URI otpauth en un clic
- Descarga el QR como PNG
- Campos de etiqueta y emisor para entradas legibles
- 100% en el cliente — el secret nunca sale del navegador
- Funciona offline tras la primera carga
