Una contraseña de un solo uso basada en el tiempo (TOTP) es un código corto que cambia cada 30 segundos. Tu app autenticadora y el sitio web conocen un secreto compartido y la hora actual, así que cada uno calcula el mismo código por su cuenta. El método está definido en el RFC 6238, que se basa en el HOTP por contador del RFC 4226. Pruébalo con el generador TOTP.
El algoritmo en cinco pasos
- Convertir el tiempo en un contador.
contador = floor(tiempo_unix / 30). - Aplicar HMAC al contador. Calcula HMAC-SHA1 (o SHA-256/512) del contador de 8 bytes en big-endian, con el secreto como clave. Puedes experimentar con el generador HMAC.
- Elegir cuatro bytes. El último nibble del resultado es un desplazamiento; toma los cuatro bytes que empiezan ahí.
- Borrar el bit superior. Aplica la máscara
0x7FFFFFFFpara que el número sea positivo. - Quedarse con las últimas cifras. Toma el número módulo 10⁶ (para seis dígitos), rellenado con ceros.
Un ejemplo verificado
El secreto de prueba del RFC 4226 es la cadena ASCII 12345678901234567890, que en la forma Base32 usada por las apps autenticadoras es GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ. Para los contadores 0, 1 y 2, HOTP da 755224, 287082 y 359152.
Para TOTP, el RFC 6238 usa el segundo 59 con un paso de 30 segundos y 8 dígitos:
| Paso | Valor |
|---|---|
| Contador | 59 ÷ 30 → 1 |
| HMAC-SHA1 | 75a48a19d4cbe100644e8ac1397eea747a2d33ab |
| Desplazamiento (último nibble) | 11 |
| Cuatro bytes, bit superior borrado | 1094287082 |
| Últimos 8 dígitos | 94287082 |
La versión de seis dígitos del mismo código es 287082. Convierte marcas de tiempo con el conversor de timestamp Unix para ver en qué paso cae un instante.
Qué hay en el código QR
El código QR contiene un enlace otpauth://totp/... con el secreto, el emisor, el número de dígitos, el periodo y el algoritmo, por ejemplo otpauth://totp/Example:[email protected]?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=Example&digits=6&period=30. Quien vea el secreto puede generar tus códigos, así que trátalo como una contraseña.
Límites
| Método | Resistente al phishing | Notas |
|---|---|---|
| Códigos SMS | No | Pueden interceptarse o sufrir un intercambio de SIM |
| App TOTP | No | Mejor que SMS, pero un sitio falso puede retransmitir el código |
| Llave de seguridad o passkey | Sí | Comprueba el dominio real del sitio |
Errores comunes
- Reloj incorrecto. La causa más común de códigos rechazados.
- Perder el secreto. Guarda los códigos de respaldo o la clave de configuración original en un lugar seguro o podrías quedarte sin acceso.
- Pegar secretos reales en páginas web. Usa el generador solo con secretos de prueba.
- Reutilizar un código. Cada código vale para un paso; los servidores suelen rechazar una repetición.
Consulta Cómo generar contraseñas y frases de contraseña seguras para el primer factor, y HMAC y Autenticación multifactor (MFA) para las definiciones.