Como segundo componente de la función, HOTP está basado en un contador que el servidor y el usuario comparten. El problema en este caso es que la contraseña que se genera es válida hasta que se utiliza. TOTP restringe este hecho: el código generado solo se puede utilizar dentro de un periodo de tiempo determinado. Pero ¿cómo funciona?
Hay tres fórmulas relevantes para el algoritmo Time-based-One-time:
TOTP = HOTP(SecretKey,CurrentTime)
Esta sencilla fórmula se limita a especificar que TOTP es un procedimiento HOTP con dos parámetros, SecretKey y CurrentTime:
- SecretKey: contraseña creada de manera aleatoria conocida tanto por el servidor como por el cliente.
- CurrentTime: momento actual en tiempo Unix.
No obstante, la indicación del tiempo varía cada segundo. Y un segundo no es suficiente para transmitir el código a la aplicación. Es decir, el TOTP ya no sería válido pasado un segundo, puesto que el servidor ya habría generado un nuevo valor hash. Por este motivo, se recurre a una fórmula adicional:
CurrentTime = floor((unixtime(now) – unixtime(T0))/T1)
El parámetro CurrentTime se define por lo tanto de la siguiente manera:
- unixtime(now): momento actual en tiempo Unix.
- unixtime(T0): tiempo Unix en el momento T0 a partir del que se cuenta, en la mayoría de los casos es el 01.01.1970 a medianoche (= 0).
- T1: intervalo en el que el TOTP debe ser válido, generalmente 30 segundos.
- floor: función de redondeo para convertir el valor calculado en un número entero.