Como funciona TOTP, o método mais usado em 2FA
NOTA: Este artigo conta com tags de HTML semântico para facilitar seu entendimento e leitura.
Ao ver uma abreviação em itálico como TOTP, é possivel passar o cursor em cima da abreviação para ver seu nome completo.
Este artigo explicará o funcionamento do algoritimo de TOTP usado em 2FA.
O algortimo TOTP foi definido no RFC6238 e é uma extensão do algoritmo HOTP definido no RFC4226. Ambos geram uma senha de 4 ou 6 números.
O TOTP visa expandir o HOTP modificando-o para que as senhas sejam geradas com base no Tempo Unix e não baseado numa contagem de senhas usadas assim como é no HOTP
O TOTP é consideravelmente mais seguro que o HOTP, pois gera novos números a cada 30 segundos enquanto o >HOTP apenas gerava assim que a ultima senha fosse usada, o que dava mais oportunidade para hackers descobrirem a senha.
Funcionamento
Temos que a geração de senhas usando o HOTP se dá como: Senha = HOTP(Chave, Semente)
A função HOTP é uma função de hashing que junta a Chave e Semente em um único número de 4 ou 6 digitos usando HMAC (RFC2104). A vantagem de uma função de hashing é que é impossivel ter os parametros iniciais a partir do resultado.
A Chave é uma string secreta de conhecimento de ambos os lados:
- Do Validador, como por exemplo, um servidor de login.
- Do Usuário: o qual tem um aplicativo como o Authenticator que gera a senha
E a Semente é um número aleatório que será dado ao gerador e garante que caso a Semente seja a mesma, o valor gerado também será o mesmo.
Para expandir esse algoritmo teremos que substituir a Semente por uma equação bem simples:
Assumiremos X como sendo o número de segundos para a geração de uma nova senha (30 Segundos).
E assumiremos T como o Tempo Unix atual.
A nova Semente será = floor(T / X)
Com isso, caso o nosso Tempo Unix seja:
- 0, então floor(0 / 30) = 0
- 30, então floor(30 / 30) = 1
- 40, então 40/30 = 1.33.. mas passando isso pelo floor() arredondando para baixo temos que floor(40 / 30) = 1
- 60, então floor(60 / 30) = 2
Veja como a cada 30 segundos nossa Semente muda, e assim a cada 30 segundos nosso código também muda. Combinando isso com a Chave na função de hashing HOTP teremos uma senha verdadeiramente única e segura gerada a cada 30 segundos.
Este é basicamente meu primeiro artigo na internet, então me desculpem se a estrutura ficou confusa ou algo parecido. Espero que tenham entendido :)