Trabajo:
El autenticador implementa el algoritmo de contraseña de una sola vez (TOTP) basada en el tiempo. Tiene los siguientes ingredientes:
• Un secreto compartido (una secuencia de bytes)
• Una entrada derivada de la hora actual
• Una función de firma
Secreto compartido:
El secreto compartido es lo que necesita obtener para configurar la cuenta en su teléfono. O toma una foto de un código QR con su teléfono o puede ingresar el secreto manualmente.
Entrada (hora actual):
El valor de tiempo de entrada que simplemente obtendrá de su teléfono, no se requiere más interacción con el servidor una vez que haya obtenido el secreto. Sin embargo, es importante que la hora de su teléfono sea precisa, ya que el servidor esencialmente repetirá lo que sucede en su teléfono usando la hora actual conocida por el servidor.
Función de firma:
La función de firma utilizada es HMAC-SHA1. HMAC significa código de autenticación de mensaje basado en Hash y es un algoritmo que utiliza una función de hash unidireccional segura (SHA1 en este caso) para firmar un valor. El uso de un HMAC nos permite verificar la autenticidad, solo las personas que saben el secreto pueden generar la misma salida para la misma entrada (la hora actual).
Algoritmo OTP:
Pseudo Código:
original_secret = xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
secret = BASE32_DECODE(TO_UPPERCASE(REMOVE_SPACES(original_secret)))
input = CURRENT_UNIX_TIME() / 30 // sets a constant value for 30 seconds
hmac = SHA1(secret + SHA1(secret + input)) //apply hashing
offset = hmac[len(hmac)-1] & 0x0F //Last nibble
four_bytes = hmac[offset : offset+4] //takes a subset of 4 bytes from 20 bytes
large_integer = INT(four_bytes) //Covert four bytes to integer
small_integer = large_integer % 1,000,00 //gives 6 digit code
Referencia: enlace
También puedes ver este proyecto github para la implementación de GO:
enlace