TOTP & HOTP
TOTP (Time-based One-Time Password, RFC 6238) y HOTP (HMAC-based One-Time Password, RFC 4226) son los dos RFC que implementan todos los QR de inscripción 2FA. El esquema URI otpauth:// codificado es el estándar de facto de Google Authenticator, universal en todas las apps de autenticación principales.
Especificación TOTP:RFC 6238 (basado en tiempo, 2011).
Especificación HOTP:RFC 4226 (basado en contador, 2005).
Esquema URI:Google Authenticator Key URI Format, el formato en el que coinciden todos los autenticadores.
Especificación HOTP:RFC 4226 (basado en contador, 2005).
Esquema URI:Google Authenticator Key URI Format, el formato en el que coinciden todos los autenticadores.
Qué es
Un QR de inscripción 2FA es una URL en el esquema otpauth:// que lleva el secreto compartido más metadatos de identificación. Formato:
otpauth://TYPE/LABEL?secret=SECRET&issuer=ISSUER&algorithm=ALG&digits=N&period=SEC- TYPE,
totp(basado en tiempo) ohotp(basado en contador). - LABEL,
Issuer:Account, codificado en URL. Ejemplo:GitHub:alice@example.com. - secret, la clave compartida, codificada en Base32 (alfabeto RFC 4648 §6: A-Z, 2-7).
- issuer, el nombre del servicio, mostrado en la app de autenticación. Redundante con la etiqueta pero mejora la UX en apps que no analizan la etiqueta.
- algorithm,
SHA1(predeterminado),SHA256oSHA512. Todos los autenticadores soportan SHA1; pocos soportan SHA256/SHA512. - digits,
6(predeterminado) o8. La mayoría de las apps de consumo esperan 6. - period, solo TOTP.
30(predeterminado) o60segundos. HOTP tiene un parámetrocounteren su lugar.
Vectores de prueba canónicos
| Caso | Entradas | URI otpauth:// esperado |
|---|---|---|
| TOTP, mínimo (SHA1, 6 dígitos, 30 s) | issuer=GitHub | otpauth://totp/GitHub:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=GitHub |
| TOTP, SHA256, 8 dígitos | issuer=Corp | otpauth://totp/Corp:bob?secret=JBSWY3DPEHPK3PXP&issuer=Corp&algorithm=SHA256&digits=8 |
| HOTP, counter=0 | issuer=YubiKey | otpauth://hotp/YubiKey:carol?secret=JBSWY3DPEHPK3PXP&issuer=YubiKey&counter=0 |
| TOTP, secreto de referencia RFC 6238 | issuer=Example | Secreto de prueba RFC estándar (12345678901234567890). Produce TOTP 94287082 en T=59 s. |
Validador de secreto Base32 en vivo
Las apps de autenticación rechazan secretos que contengan algo fuera del alfabeto Base32 (A-Z, 2-7). A continuación está el mismo validador que Abundera ejecuta dentro del generador TOTP, se ejecuta en tu navegador.
Introduce un secreto para validar.
Errores comunes
- Base32 no es Base64. Base64 usa A-Z, a-z, 0-9, +, /, cualquiera de esas letras minúsculas o dígitos 0, 1, 8, 9 en tu secreto significa que te dieron una cadena Base64 y será rechazada por todo autenticador.
- Longitud del secreto. RFC 4226 §4 recomienda al menos 128 bits (26 caracteres Base32) para HOTP y 160 bits (32 caracteres) para TOTP. Los secretos de menos de 80 bits (16 caracteres) son técnicamente legales pero se señalan como débiles.
- El soporte de algoritmos varía. Google Authenticator ignora el parámetro
algorithmy siempre usa SHA1. Para que SHA256/SHA512 tome efecto, tus usuarios deben estar en 1Password, Authy, Bitwarden o Microsoft Authenticator. - El soporte de dígitos varía. La mayoría de los autenticadores ignoran
digits=8y truncan silenciosamente a 6. Si los OTP de 8 dígitos importan (banca, algunas apps gubernamentales), prueba tu autenticador objetivo antes de lanzar. - Codifica la etiqueta en URL. Los caracteres especiales en emisor o cuenta (
:,@, espacio) deben estar en porcentaje-codificados en la etiqueta, o los autenticadores más antiguos eliminan la etiqueta por completo. Abundera lo gestiona automáticamente. - Nunca reutilices secretos. Cada cuenta obtiene un secreto nuevo y criptográficamente aleatorio. Reutilizar un secreto en servicios significa que un compromiso en uno rompe todos.
- El almacenamiento importa más que el QR. El QR es un bootstrap de una sola vez. La app de autenticación almacena el secreto después del primer escaneo. Si ese secreto luego se exporta en texto plano (algunas apps lo hacen), una filtración de disco = cada 2FA comprometida.
Compatibilidad de apps de autenticación
| App | TOTP SHA1 | TOTP SHA256/512 | HOTP | 8 dígitos | Notas |
|---|---|---|---|---|---|
| Google Authenticator | Sí | Ignorado | Sí | Ignorado | La línea base de facto. Siempre apunta a esto primero. |
| 1Password | Sí | Sí | Sí | Sí | Soporte RFC completo. |
| Authy | Sí | Sí | No | Sí | Elimina HOTP en versiones más recientes. |
| Bitwarden | Sí | Sí | Sí | Sí | Soporte RFC completo. |
| Microsoft Authenticator | Sí | Sí | Sí | Sí | Soporte RFC completo. |
| YubiKey Authenticator | Sí | Sí | Sí | Sí | HOTP es el modo canónico de YubiKey. |
| Duo Mobile | Sí | Ignorado | No | Ignorado | Usa su propio flujo push; TOTP es solo fallback. |
Ver también
- /totp-2fa-qr-code/, el generador TOTP con validador Base32 incorporado.
- /hotp-qr-code/, variante HOTP basada en contador.
- /standards/, volver al índice de estándares.