Pular para o conteúdo
Todos os conceitos

Código do autenticador

O segundo fator de 6 dígitos que muda a cada 30 segundos, calculado do segredo e do relógio.

Senha sozinha é um fator só: quem a rouba, entra. O segundo fator pede, além dela, algo que muda o tempo todo e que só o dono tem. O mais comum é o código de 6 dígitos de um aplicativo autenticador, o TOTP (RFC 6238).

Na ativação, o serviço e o app combinam um segredo (em geral mostrado como QR code e como texto Base32). A partir daí, os dois calculam o mesmo código sem trocar mais nada, assim:

  1. Pegue o tempo atual em segundos (tempo Unix) e divida por 30, jogando fora a parte quebrada: esse é o contador da janela de 30 segundos.
  2. Calcule o HMAC-SHA1 do contador (8 bytes) usando o segredo como chave. Saem 20 bytes.
  3. Truncagem dinâmica: o último nibble dá um deslocamento; leia 4 bytes a partir dali, zere o bit mais alto e tire o resto por 10^6. Preencha com zeros à esquerda até 6 dígitos.
segredo relógio (tempo) T = tempo ÷ 30 HMAC-SHA1 trunca 482913 código o código muda a cada 30 segundos
Do segredo e do relógio sai o contador de 30 s; o HMAC-SHA1 dele é truncado nos 6 dígitos que o app mostra, e a cada 30 s o código muda.

Em Python, só com a biblioteca padrão:

import hmac, hashlib, base64, struct
seg = base64.b32decode("JBSWY3DPEHPK3PXP")
t = tempo_unix // 30
h = hmac.new(seg, struct.pack(">Q", t), hashlib.sha1).digest()
o = h[-1] & 0x0f
print(f"{(struct.unpack('>I', h[o:o+4])[0] & 0x7fffffff) % 1000000:06d}")

Como o código depende do relógio, o servidor costuma aceitar a janela anterior e a seguinte, para tolerar relógios fora de hora. O que torna o segundo fator forte é que o segredo nunca viaja no login: uma senha roubada, sozinha, não basta, porque falta o código do momento.

Aparece nestes desafios