HOTP
HOTP (HMAC-based One-Time Password, RFC 4226) é a variante baseada em contador do TOTP. Onde TOTP avança em um relógio, HOTP avança em um contador compartilhado que tanto o token quanto o servidor incrementam a cada código usado. HOTP é o modo canônico para YubiKey OATH, tokens de hardware legados e alguns fluxos bancários onde o servidor não pode depender de sincronização de relógio.
URI scheme:Google Authenticator Key URI Format, the
otpauth:// scheme every authenticator agrees on. Sibling spec:TOTP (RFC 6238), time-based variant that builds on HOTP.
O que é
An HOTP enrolment QR is a URL in the otpauth:// scheme with hotp as the type. It carries the shared HMAC secret plus a counter value that both sides must keep in sync. Format:
otpauth://hotp/LABEL?secret=SECRET&issuer=ISSUER&counter=N&digits=N&algorithm=ALG- LABEL,
Issuer:Account, URL-encoded. Example:YubiKey:alice@example.com. - secret, the shared HMAC key, Base32-encoded (RFC 4648 §6: A-Z, 2-7).
- counter, starting counter value. Usually
0, but can be resumed from a known value when re-enrolling a token. - issuer, the service name shown in the authenticator app.
- digits,
6(default) or8. RFC 4226 §5.3 specifies 6; 8 is a common extension. - algorithm,
SHA1in practice. RFC 4226 only defines SHA1; SHA256/512 variants are RFC 6238 extensions bolted on after-the-fact.
HOTP vs TOTP, quando usar cada um
| Propriedade | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| Avança em | Contador | Relógio (a cada 30 s) |
| Requer sincronização de relógio | Não | Sim, dentro de ~30 s de desvio |
| Ressincronização ao desvio | O servidor aceita os próximos N valores de contador | O servidor aceita ±1 janela |
| Implantação típica | YubiKey, tokens de hardware legados, banco offline | Todo 2FA de consumidor, Google, Microsoft, 1Password, Authy |
| Reutilização do contador | Catastrófico, vaza o segredo ao longo do tempo | N/A |
| Vulnerabilidade se o segredo vazar | Todos os códigos futuros previsíveis | Todos os códigos passados + futuros previsíveis |
Vetores de teste canônicos
RFC 4226 Appendix D provides reference HOTP values for the secret 12345678901234567890 (20 bytes, Base32 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ) with 6-digit output:
| Counter | HOTP (6-digit) |
|---|---|
0 | 755224 |
1 | 287082 |
2 | 359152 |
3 | 969429 |
4 | 338314 |
5 | 254676 |
6 | 287922 |
7 | 162583 |
8 | 399871 |
9 | 520489 |
Minimal QR payload for enrolment at counter 0:
otpauth://hotp/Example:test?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=Example&counter=0Validador de segredo Base32 ao vivo
Same validator as the TOTP page, HOTP secrets use the identical Base32 alphabet (RFC 4648 §6: A-Z, 2-7). Runs in your browser, no server round-trip.
Armadilhas comuns
- Desvio do contador. Se o usuário pressionar o botão do token mas o servidor não registrar o código (falha de rede, clique duplo), o contador do token fica à frente do servidor. Os servidores lidam com isso com uma "janela de ressincronização", tentam os próximos N valores de contador antes de rejeitar. A janela padrão do YubiKey é ~3; implantações de alta segurança a reduzem para 1.
- A reutilização do contador é catastrófica. Nunca aceite o mesmo valor de contador duas vezes. Se o servidor aceitar, um invasor que capturou um código pode reproduzi-lo depois. RFC 4226 §7.3 exige que o servidor recuse qualquer código no ou abaixo do último contador aceito.
- Exportação do contador durante o backup. Apps de autenticação que exportam entradas HOTP às vezes exportam o segredo mas não o contador atual. Importar em um novo dispositivo reinicia o contador em 0, fora de sincronia com o servidor, inscrição efetivamente quebrada. TOTP é imune; HOTP é frágil aqui.
- Base32 não é Base64. Mesma regra que TOTP: segredos com
0,1,8,9, letras minúsculas,+ou/são Base64 e serão rejeitados por todo autenticador compatível com RFC. - Somente SHA1, na prática. RFC 4226 define SHA1 como a função HMAC. SHA256/SHA512 são extensões da era TOTP RFC 6238; a maioria dos tokens de hardware HOTP (incluindo YubiKey OATH) não os implementa.
- Parâmetro de dígitos frequentemente ignorado. Muitos tokens de hardware estão fixados em 6 dígitos e truncam silenciosamente se você pedir 8. Verifique com seu hardware alvo antes de o QR chegar a cartões impressos.
- Não misture HOTP e TOTP no mesmo QR. O esquema URI usa o segmento
TYPE(hotpvstotp) para mudar de modo. Um único segredo pode alimentar ambos, mas isso significa que ambos os fluxos compartilham o segredo, se um for comprometido, ambos falham.
Compatibilidade de apps de autenticação
| App / token | HOTP | SHA256/512 | 8 dígitos | Notas |
|---|---|---|---|---|
| YubiKey Authenticator (iOS/Android/desktop) | Sim | Sim | Sim | HOTP é o modo canônico do YubiKey OATH. Suporte RFC 4226 completo. |
| Google Authenticator | Sim | Ignorado (somente SHA1) | Ignorado (somente 6) | A linha base de facto. Seguro para HOTP mas somente com 6 dígitos SHA1. |
| 1Password | Sim | Sim | Sim | Suporte RFC completo. O contador é armazenado e exportado com a entrada. |
| Bitwarden | Sim | Sim | Sim | Suporte RFC completo. |
| Microsoft Authenticator | Sim | Sim | Sim | Suporte RFC completo. |
| Authy | Não | , | , | Removeu HOTP em versões recentes. Somente TOTP. |
| Duo Mobile | Não | , | , | Usa seu próprio fluxo push; somente TOTP como fallback. |
| Tokens de hardware OATH (Feitian, Token2, etc.) | Sim | Varia | Varia | Mercado canônico de hardware HOTP; sempre 6 dígitos SHA1 a menos que o datasheet diga diferente. |
Veja também
- /hotp-qr-code/, o gerador HOTP com validação de contador + Base32 ao vivo.
- /standards/totp/, a variante baseada em tempo (RFC 6238).
- /totp-2fa-qr-code/, o gerador TOTP.
- /standards/, voltar ao índice de padrões.