⏱️ Criptografia & Protocolos RFC ✓ Padrões IETF Analisados

TOTP vs HOTP explicados: Diferenças fundamentais, funcionamento e segurança

Milhões de desenvolvedores e engenheiros de segurança visualizam códigos rotativos de 6 dígitos todos os dias, mas poucos conhecem as engrenagens matemáticas elegantes que operam por trás da tela. Dos contadores acionados por eventos da RFC 4226 (HOTP) em 2005 às fatias de tempo discretas da RFC 6238 (TOTP) em 2011, este guia disseca o algoritmo de Truncamento Dinâmico no nível de bytes, as vulnerabilidades de dessincronização de contadores, as tolerâncias de desvio de relógio e as razões pelas quais o TOTP se tornou o soberano indiscutível da internet moderna.

2FA
Equipe de Segurança 2FA-Tool
Atualizado em Outubro de 2026
Tempo Estimado de Leitura: 14 min (+2.600 palavras)
RFC 6238 RFC 4226 Truncamento Dinâmico
💡 Destaques Criptográficos (TL;DR)
  • A Diferença Fundamental na Entrada: O HOTP calcula hashes a partir de um contador C incremental e monotônico, enquanto o TOTP substitui C por um passo de tempo discreto T (TempoUnixAtual / 30).
  • Herança Direta: O TOTP é matematicamente uma especialização do HOTP: TOTP(K, Tempo) = HOTP(K, T). Ambos os algoritmos empregam exatamente a mesma função de Truncamento Dinâmico (Dynamic Truncation).
  • Fator Decisivo de Arquitetura: O HOTP possui estado (stateful): os servidores precisam registrar e persistir em disco o avanço de contadores a cada autenticação. O TOTP não possui estado (stateless), permitindo que microsserviços modernos validem tokens em clusters distribuídos com balanceamento de carga sem gravações centralizadas em banco de dados.
01

Origem Histórica: Dos Tokens Físicos aos Smartphones

No início dos anos 2000, a autenticação corporativa em dois fatores era dominada por tokens físicos proprietários, como o RSA SecurID. Esses chaveiros fechados e caros continham osciladores a quartzo internos sincronizados com servidores corporativos dedicados. Quando uma organização precisava oferecer segurança multifator a milhares de funcionários, o custo de aquisição de hardware e licenciamento era estratosférico.

Para libertar o mercado dos ecossistemas proprietários, o consórcio OATH (Initiative for Open Authentication) reuniu gigantes da indústria para conceber padrões IETF abertos e livres de royalties, que qualquer engenheiro pudesse inspecionar, auditar e implementar:

📜 2005: RFC 4226 (HOTP)

Algoritmo de Senha de Uso Único Baseada em HMAC. Projetado para microcontroladores de baixo consumo com botão físico. Cada toque incrementa um contador interno e projeta um token de 6 dígitos em visor LCD.

📜 2011: RFC 6238 (TOTP)

Algoritmo de Senha de Uso Único Baseada em Tempo. Criado no auge da ascensão dos smartphones. Ao aproveitar a sincronização precisa de relógio via rede celular NTP, eliminou de vez as dessincronizações de botões físicos.

02

HOTP (RFC 4226) & Truncamento Dinâmico de Bytes

A formulação matemática fundamental do HOTP é notavelmente concisa:

HOTP(K, C) = Truncate(HMAC-SHA-1(K, C)) mod 10DigitCount

Detalhamento dos Parâmetros:

  • K: Chave secreta simétrica compartilhada (geralmente decodificada de Base32 para uma sequência binária de 160 bits / 20 bytes).
  • C: Contador inteiro de 8 bytes (64 bits) em formato big-endian.
  • HMAC-SHA-1: Código de autenticação de mensagem baseado em hash criptográfico gerando digest de 20 bytes (160 bits).

🔍 Como o Truncamento Dinâmico (DT) Converte 20 Bytes em 6 Dígitos:

Um digest HMAC-SHA1 possui 160 bits (20 bytes). Extrair 6 dígitos decimais uniformes exige um algoritmo determinístico e resistente a colisões, estipulado na Seção 5.3 da RFC 4226:

// Passo 1: Calcular o Offset Dinâmico
Offset = HS[19] & 0x0F
Pega-se o último byte (índice 19) do digest de 20 bytes. A operação de máscara bit a bit com 0x0F isola os 4 bits de menor ordem, resultando em um inteiro estritamente entre 0 e 15 (0x0 a 0xF). Isso assegura que a extração subsequente de 4 bytes nunca ultrapasse o buffer de 20 bytes (pois 15 + 4 = 19).
// Passo 2: Extrair 4 Bytes Consecutivos com Máscara de Sinal
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Extraem-se os 4 bytes iniciando no Offset. A máscara 0x7F zera o bit mais significativo (MSB) para evitar problemas de sinal e overflow em diferentes arquiteturas de CPU (garantindo um inteiro positivo de 31 bits limpo).
// Passo 3: Operação Módulo para Gerar os Dígitos Finais
OTP = P mod 106 = P mod 1000000
Aplicar módulo 1.000.000 isola os 6 dígitos decimais finais, preenchendo com zeros à esquerda se necessário (ex.: 748 vira "000748").
🧪 Vetor de Teste Real do Apêndice D da RFC 4226:

Suponha que a chave secreta seja a string ASCII "12345678901234567890" e o contador seja C = 0. O digest HMAC-SHA1 resultante em hexadecimal é:

cc 93 cf 18 50 8d 94 93 4c 64 b6 6d 8b fb 87 fb 23 cb 4b 71

1. O byte final é 0x71. Fazendo 0x71 & 0x0F = 0x01, obtém-se Offset = 1.
2. Os bytes do índice 1 ao 4 são: 93 cf 18 50. Zerando o bit de sinal mais alto resulta em 0x13cf1850, que em decimal equivale a 332.339.280.
3. Calculando 332339280 mod 1000000 = 339280. O código final de 6 dígitos gerado é exatamente 339280!

03

Evolução para o TOTP (RFC 6238): O Passo Temporal

O HOTP exigia manter o contador do cliente rigidamente sincronizado com o servidor. Em dispositivos com software, contar toques ou cliques causava constantes falhas humanas e descompassos.

A RFC 6238 substituiu o contador de eventos C por um passo temporal discreto T calculado a partir do relógio Unix Epoch:

T = ⌊ (TempoUnixAtual - T0) / X ⌋
  • TempoUnixAtual: Número de segundos decorridos desde 01-01-1970 00:00:00 UTC.
  • T0: Referência de início de época (padronizado em 0 em todas as implementações atuais).
  • X (Janela Temporal / Time Step): Intervalo de tempo recomendado de 30 segundos.
  • Função Piso ⌊ ⌋: Para qualquer segundo dentro da janela de 30 segundos, T permanece rigorosamente constante. Por exemplo, entre os segundos de época 1728211200 e 1728211229, o valor de T avalia exatamente para o mesmo número inteiro de 64 bits.

Serialização Binária: Uma vez calculado T, ele é serializado em um buffer de 8 bytes em big-endian (idêntico à estrutura do contador C no HOTP). Por isso, a fórmula unificada resume-se a:
TOTP(K, Tempo) = HOTP(K, T) Essa elegância matemática explica por que os aplicativos autenticadores renovam códigos sincronizadamente a cada 30 segundos sem qualquer necessidade de salvar contadores em disco.

Suporte da RFC 6238 a SHA-256 e SHA-512: Enquanto a RFC 4226 utilizava exclusivamente HMAC-SHA-1, a RFC 6238 expandiu a especificação para HMAC-SHA-256 e HMAC-SHA-512. No SHA-256 (digest de 32 bytes), o offset é obtido no byte 31 (HS[31] & 0x0F); no SHA-512 (digest de 64 bytes), o offset é retirado no byte 63 (HS[63] & 0x0F). Entretanto, em 99,9% dos sites corporativos (Google, Microsoft, GitHub, AWS), o SHA-1 permanece como padrão universal por questões de compatibilidade histórica de clientes móveis.
04

Matriz Comparativa Completa Lado a Lado (HOTP vs. TOTP)

Dimensão HOTP (RFC 4226) TOTP (RFC 6238)
Variável de Entrada Contador de eventos C (incremental e monotônico) Passo de tempo T (janela Unix Epoch de 30 segundos)
Validade do Token Indefinida (válido até ser consumido no próximo login) Estrita de 30 segundos (expira automaticamente)
Arquitetura de Servidor Com Estado / Stateful (requer gravação atômica em BD por login) Sem Estado / Stateless (validação independente via NTP)
Exposição a Ataque de Replay Moderada (código interceptado é válido até o uso) Mínima (restrita aos segundos restantes da janela atual)
Principal Modo de Falha Dessincronização de Contador (cliques acidentais) Desvio de Relógio (Clock Drift no smartphone)
Hashes Suportados HMAC-SHA-1 exclusivamente HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Adoção no Mercado Tokens bancários legados e catracas industriais 99,9% dos autenticadores modernos da web
05

Dessincronização vs. Desvio de Relógio: Mitigações de Engenharia

Em sistemas de produção distribuídos, clientes e servidores sofrem variações naturais. Os criadores dos protocolos estabeleceram janelas de tolerância explícitas:

⚙️ Mitigação do HOTP: Janela de Antecipação (Look-Ahead Window s)

Se um usuário apertar o botão do chaveiro 5 vezes sem fazer login, o contador do aparelho atinge C+5 enquanto o servidor continua em C.
A RFC 4226 estipula que o servidor teste uma janela prospectiva entre [C+1, C+s] (geralmente s=20). Havendo correspondência, o servidor avança seu contador imediatamente para ressincronizar com o cliente.

⏱️ Mitigação do TOTP: Tolerância a Desvio Temporal (Janela de ±1 Passo)

Latência de rede e desvios de relógio de hardware (por exemplo, um celular com 10 segundos de atraso) fazem o código chegar na janela vizinha.
Servidores de produção avaliam um array de 3 janelas: [T-1, T, T+1], expandindo a janela total de aceitação para 90 segundos.

Bloqueio Anti-Replay Mandatório: Para impedir o reuso malicioso de um token interceptado dentro da tolerância de 90 segundos, os servidores gravam o token validado em memória temporária (ex.: Redis) por 90 segundos, rejeitando qualquer segunda submissão idêntica.
🛡️ Comparação de Strings em Tempo Constante (Defesa contra Timing Attacks):

Ao comparar o código enviado pelo usuário com o calculado no servidor, comparações de string ingênuas (como codigoUsuario === codigoServidor) abortam no primeiro caractere divergente. Atacantes com cronômetros de rede de altíssima precisão conseguem deduzir dígitos medindo microssegundos de resposta. Backends corporativos exigem comparações em tempo constante (como crypto.timingSafeEqual no Node.js) para frustrar ataques de canal lateral (side-channel).

06

Por que o TOTP Dominou a Internet Moderna

A vitória decisiva do TOTP sobre o HOTP em escala global ocorreu por três imperativos de arquitetura:

☁️ Escalabilidade em Nuvem Sem Estado

Em microsserviços distribuídos em várias regiões, qualquer servidor com relógio NTP sincronizado valida tokens TOTP sem travar nem consultar bancos de dados centralizados.

📱 Sinergia com o Ecossistema Móvel

Smartphones calibram a hora continuamente via antenas celulares e GPS, eliminando falhas de desvio de relógio sem requerer manutenção física de aparelhos.

🛡️ Janela Curta de 30 Segundos de Exposição

Tokens HOTP continuam válidos indefinidamente até o próximo uso. Códigos TOTP expiram em 30 segundos, neutralizando vazamentos em logs e capturas de pacotes automaticamente.

🧮 Motor RFC 6238 100% no Cliente

Experimente os Cálculos TOTP em Tempo Real no 2FA-Tool

Veja na prática como sua semente secreta Base32 se transforma em códigos dinâmicos de 6 dígitos via truncamento dinâmico HMAC-SHA1. Totalmente offline no seu navegador.

Abrir Gerador Online