# Algoritmo de contraseña de un solo uso basada en el tiempo

El algoritmo de contraseña de un solo uso o TOTP (Time-based one time password en inglés) es un algoritmo que permite generar una contraseña de un solo uso (OTP) que utiliza la hora actual como fuente de singularidad. Es una extensión del algoritmo de contraseña de un solo uso basado en HMAC (HOTP), y está considerado como una tecnología estándar por el Grupo de Trabajo de Ingeniería de Internet bajo el identificador RFC 6238.
El algoritmo TOTP es la base de la Iniciativa para la autenticación abierta (OATH), una iniciativa de la industria que promueve la generalización de esta tecnología en un buen número de sistemas de autenticación de doble factor. Existen un amplio abanico de aplicaciones informáticas (tanto de código abierto como propietarias) orientadas a usuarios finales y que permiten la autenticación en servidores que utilicen esta tecnología.

## Historia

El borrador del algoritmo TOTP nace en 2008 impulsado por la colaboración de varios miembros de la OATH, cuyo fin era el de crear un estándar abierto que respaldara la mayoría de la industria. Complementa al estándar HOTP basado en eventos, y permite que las empresas enfocadas a usuarios finales y las organizaciones puedan desarrollar su propia implementación o escoger aquella que más le convenga según sus propias directrices de seguridad. En mayo de 2011, el algoritmo TOTP se convirtió oficialmente en el estándar RFC 6238.

## Algoritmo

Para establecer la autenticación TOTP, el usuario y el autenticador deben disponer tanto de los parámetros HOTP como los siguientes parámetros propios:
* T$_0$, el tiempo Unix a partir de la cual empezar a contar las unidades de tiempo (por defecto es 0).
* T$_X$, un intervalo que se utilizará para calcular el valor del contador C$_T$ (por defecto es 30 segundos).
Basándose en estos parámetros, ambas partes implicadas calculan el valor TOTP. Cuando el usuario desea autenticarse, comunica su clave al servidor autenticador y este puede verificar su validez comprobando si este valor coincide con el que se ha computado de forma local.
Algunas implementaciones del autenticador toleran cierto margen de error en cuanto al tiempo, dando como válidos valores que deberían haberse generado antes de la hora actual (generalmente unos pocos segundos). Esto permite considerar factores como el sesgo de reloj, la latencia de la red o el tiempo de reacción del usuario.
TOTP usa internamente el algoritmo HOTP, reemplanzando el contador con un valor no decreciente basado en la hora actual:
    $\mathrm {V} _{\mathrm {TOTP} }(K)=V_{\mathrm {HOTP} }(K,C_{T})$
Donde el valor del contador se calcula como:
    $C_{T}=\left\lfloor {\frac {T-T_{0}}{T_{X}}}\right\rfloor$
* C$_T$ es el recuento del número de intervalos T$_X$ entre T$_0$ y T.
* T es el tiempo actual en segundos desde una época en particular.
* T$_0$ es la época especificada en segundos contando a partir de la época Unix (si se usa Tiempo Unix, entonces T$_0$ será 0).
* T$_X$ es la duración de un intervalo de tiempo (por ejemplo, 30 seconds).

## Seguridad

El concepto de contraseñas de un solo uso con validez limitada en el tiempo, junto con los métodos criptográficos modernos, se utilizan habitualmente en la industria para implementar sistemas de autenticación remota que se pueden considerar como seguros y fiables.
Al igual que otros sistemas de seguridad, TOTP no está exento de potenciales vulnerabilidades. El ataque más común consiste en el uso de técnicas de ingeniería social para que los usuarios revelen su valor TOTP. Sin embargo, dado que la validez temporal de estos códigos es muy limitada, esto requiere que dicho ataque se produzca en tiempo real, haciéndolo más robusto que el uso de contraseñas tradicionales.
Si un atacante consiguiera tener acceso al secreto compartido, podría generar nuevos valores TOTP a voluntad. Aunque la posibilidad de que esto se produzca es más remota, esto podría ser un problema particular si un atacante consigue infiltrarse en una gran base de datos de autenticación. con el fin de engañar a los usuarios