Segurança

Gerador de códigos TOTP de dois fatores

Cole o segredo base32 que um site forneceu — ou o link otpauth:// inteiro — e o código atual aparece, junto com o próximo e quanto tempo falta para o atual acabar. O segredo fica só na página e em nenhum outro lugar; recarregar apaga tudo.

Apenas base32. Espaços e letras minúsculas não são problema. Cole um link otpauth:// inteiro e os ajustes ao lado se preenchem sozinhos.

------ Código atual
-- Segundos restantes
------ Próximo código

O relógio do seu aparelho decide o código. Se todos os códigos forem recusados, confira o relógio antes de culpar o segredo.

Como seis dígitos saem de um segredo compartilhado

TOTP é uma camada fina sobre o HMAC. Você e o servidor guardam o mesmo segredo, normalmente 20 bytes aleatórios. Os dois lados pegam o tempo Unix atual, dividem por 30 e descartam o resto, o que dá um contador que muda duas vezes por minuto e é o mesmo nas duas máquinas. Esse contador é escrito como oito bytes e passa pelo HMAC com o segredo compartilhado como chave.

O resultado tem 20 bytes, muito mais do que alguém digitaria. O último nibble do MAC é lido como um número de 0 a 15, e esse número vira um deslocamento dentro do próprio MAC: quatro bytes são lidos a partir dali, o bit mais alto é descartado e o resto da divisão por um milhão dá seis dígitos. Descartar o bit mais alto não tem nada a ver com segurança — existe para que as implementações que tratam o valor como com sinal e as que tratam como sem sinal cheguem à mesma resposta.

A versão baseada em contador é o HOTP, definido na RFC 4226; o TOTP, na RFC 6238, é a mesma construção com o tempo no lugar do contador. Essa linhagem explica por que o truncamento parece tão estranho: ele foi projetado em 2005 para ser implementável em um token de hardware.

Por que o segredo é em base32

O base32 usa de A a Z e os dígitos de 2 a 7. Não há 0, nem 1, nem 8, justamente porque são os caracteres que as pessoas confundem com O, I e B ao copiar uma chave à mão. Ele também não diferencia maiúsculas de minúsculas, coisa que o base64 diferencia. O custo é o tamanho: o base32 precisa de 32 caracteres para carregar os 20 bytes que o base64 coloca em 27.

Se a ferramenta acima recusa um caractere, esse costuma ser o problema: um O maiúsculo digitado onde nunca houve um zero, ou um l minúsculo no lugar de um 1.

O relógio é metade do algoritmo

Nada é trocado quando você digita um código. O servidor calcula o mesmo número por conta própria, o que só funciona se os dois relógios concordarem. A maioria dos servidores aceita também o passo anterior e o seguinte, além do atual, ou seja, cerca de 90 segundos de janela com o passo usual de 30 segundos. Fora disso, os códigos simplesmente estão errados.

Um aparelho com o relógio desviado alguns minutos gera códigos recusados em todo lugar, o que parece exatamente um segredo quebrado. Esta página não tem como avisar que o seu relógio está errado, porque ela nunca fala com um servidor — não há com o que comparar.

O que um segundo fator não resolve

O TOTP acaba com o credential stuffing e a reutilização de senhas: uma senha vazada sozinha já não basta. Ele não impede phishing. Um código digitado em uma página falsa convincente vale 30 segundos para quem estiver repassando essa página ao site real, e os kits de phishing modernos fazem exatamente isso em tempo real. Passkeys e chaves de segurança resolvem isso de verdade porque amarram o login à origem do site, algo que um número de seis dígitos copiado não consegue fazer.

O outro ponto fraco é a própria semente. O servidor precisa guardá-la em um formato que consiga ler, então um vazamento do banco de dados entrega aos atacantes um gerador de códigos permanente, e não apenas um hash de senha para quebrar por força bruta.

Até onde esta ferramenta vai

Ela não lê QR code. Não há acesso à câmera nem decodificador de QR aqui, então você precisa da semente em texto — quase todo site a mostra atrás de um link do tipo "não consegue escanear o código?" ao lado da imagem.

Ela não faz HOTP. Códigos baseados em contador precisam de um estado que sobreviva entre os usos, e esta página, de propósito, não guarda nada.

Alguns serviços usam um TOTP modificado que nunca vai bater: os códigos de cinco caracteres da Steam são o exemplo mais conhecido, já que mapeiam o mesmo número truncado para um alfabeto próprio em vez de dígitos.

Os campos de dígitos, passo e algoritmo existem porque o formato otpauth os permite, mas vários aplicativos autenticadores populares ignoram esses parâmetros por completo e assumem SHA-1, seis dígitos e trinta segundos. Se um link diz SHA-256 e todos os códigos são recusados, troque para SHA-1 antes de concluir que o segredo está errado.

Por fim, o óbvio. Uma ferramenta que guarda a sua semente de 2FA pode gerar os seus códigos para sempre, e colar uma semente ativa em qualquer página web é uma decisão que vale a pena tomar com consciência. Nada aqui é gravado no armazenamento, enviado a lugar nenhum ou mantido depois de recarregar — mas isto foi feito para testar uma implementação, confirmar que uma semente de backup ainda funciona ou entrar uma vez quando o celular sumiu. Não é um aplicativo autenticador.

Perguntas frequentes

O meu segredo é enviado para algum lugar?

Não. A página são arquivos estáticos sem nenhum servidor por trás, o código é calculado com a API crypto do navegador, e o segredo não é gravado no armazenamento local, nem em cookies, nem na URL. Recarregue a página e ele some.

Por que o meu código é recusado mesmo com a ferramenta mostrando um?

Três causas comuns: um relógio do aparelho desviado mais de um minuto, um site que espera SHA-1 enquanto o link pediu SHA-256, ou um segredo copiado com um caractere faltando. Teste primeiro o mesmo segredo com SHA-1, seis dígitos e passo de 30 segundos.

Posso usar isto no lugar de um aplicativo autenticador?

Pode, e é um downgrade. Um aplicativo guarda a semente no armazenamento seguro do celular; uma aba do navegador a deixa na área de transferência e no seu histórico de páginas. Use isto para testar uma implementação ou para recuperar o acesso, e mantenha o seu segundo fator do dia a dia em um aplicativo de verdade ou em uma chave de hardware.

O que eu faço com um link otpauth://?

Cole o link inteiro no campo do segredo. O segredo é extraído e os ajustes de dígitos, passo e algoritmo são preenchidos com os parâmetros do link quando eles estão presentes.

Por que ela não escaneia o QR code?

Decodificar uma imagem QR exige acesso à câmera ou uma biblioteca de decodificação, e nenhuma das duas cabe em uma ferramenta tão pequena. Todo site que mostra um QR code também mostra a semente em texto para quem digita em um aplicativo de desktop — use essa.

Última atualização 19 de setembro de 2026