TOTP ou SMS/WhatsApp: qual 2FA escolher (Google Authenticator)
Comparativo entre TOTP (Google Authenticator) e código por WhatsApp/SMS: segurança, adoção, custo e uma recomendação prática por tipo de aplicação.
Quem está desenhando o segundo fator de um app esbarra cedo na mesma dúvida: TOTP ou SMS? De um lado, o código gerado por aplicativos como Google Authenticator, Authy ou 1Password, que funciona offline e não custa nada por uso. De outro, o código enviado por WhatsApp ou SMS, que o usuário já entende e não exige instalar nada.
A resposta curta é que não existe vencedor absoluto. Existe o fator certo para cada tipo de conta, de usuário e de risco — e, na maior parte dos produtos, a decisão madura é oferecer os dois com uma ordem de preferência bem definida.
Este comparativo mostra como cada método funciona, onde cada um falha, quanto custa implementar e termina com uma recomendação por tipo de aplicação. Os conceitos de base estão no guia de autenticação de dois fatores (2FA).
Como funciona o TOTP (Google Authenticator)
TOTP significa Time-based One-Time Password e está definido na RFC 6238, uma extensão do HOTP (RFC 4226). Na ativação, seu servidor gera um segredo aleatório e o entrega ao usuário, normalmente em um QR code no formato otpauth://, e o aplicativo autenticador o guarda.
A partir daí, servidor e aplicativo calculam o mesmo código de forma independente: um HMAC do segredo com o tempo atual dividido em janelas de 30 segundos, reduzido a 6 dígitos. Nada trafega pela rede durante o login além do código digitado. Por isso o TOTP funciona em modo avião, no exterior e sem chip.
Três detalhes pesam mais do que parecem:
- Tolerância de relógio: aceite a janela anterior e a seguinte, senão usuários com o relógio desajustado ficam presos para fora.
- Uso único: registre o último código aceito e rejeite reuso dentro da mesma janela.
- Segredo protegido: guarde o segredo cifrado no banco, porque quem o lê consegue gerar códigos para sempre.
Em Node.js, bibliotecas como a otplib resolvem geração e validação em poucas linhas:
import { authenticator } from "otplib";
// Ativação: gere e guarde o segredo (cifrado) junto ao usuário
const secret = authenticator.generateSecret();
const otpauthUrl = authenticator.keyuri("[email protected]", "MeuApp", secret);
// -> transforme otpauthUrl em QR code e exiba na tela
// Login: valide o código digitado contra o segredo salvo
const valido = authenticator.check(codigoDigitado, secret);
Como funciona o código por WhatsApp ou SMS
No código por mensagem, o segredo não fica com o usuário: é o servidor que gera um código aleatório de curta duração, envia para o telefone cadastrado e guarda o estado da verificação. O usuário prova que controla aquele número ao digitar o código recebido.
Na prática, o fator deixa de ser "algo que você tem" (o segredo no app) e passa a ser "o acesso ao número de telefone" — uma vantagem enorme de adoção e uma desvantagem de segurança.
Com uma API de verificação, o fluxo cabe em duas chamadas. A aut2fa, por exemplo, escolhe o canal entre os permitidos na aplicação (WhatsApp, SMS ou e-mail), gera o código e devolve apenas um identificador de envio, nunca o código:
const BASE = "https://api.aut2fa.com";
const headers = {
Authorization: `Bearer ${process.env.AUT2FA_API_KEY}`, // ak_test_... ou ak_live_...
"Content-Type": "application/json",
};
// 1) Dispara o código para o telefone do usuário
const envio = await fetch(`${BASE}/v1/send`, {
method: "POST",
headers,
body: JSON.stringify({ to: "+5531987654321", locale: "pt-BR" }),
}).then((r) => r.json()); // 202 -> { id: "snd_...", expires_at: "..." }
// 2) Confere o código digitado; prossiga só com valid === true
const resultado = await fetch(`${BASE}/v1/send/${envio.id}/verify`, {
method: "POST",
headers,
body: JSON.stringify({ code: codigoDigitado }),
}).then((r) => r.json()); // { valid, verification, attempts_left }
Em modo de teste o código é sempre 000000 e nada é entregue, o que permite automatizar os testes do login sem gastar saldo. A escolha entre SMS ou WhatsApp para o código de verificação fica para outro texto; aqui, os dois são "código por mensagem".
Segurança: SIM swap, phishing e perda do celular
É aqui que o debate TOTP ou SMS costuma esquentar, então vale separar as ameaças.
SIM swap. No golpe da troca de chip, o atacante convence (ou suborna) alguém na operadora a transferir o número da vítima para um chip que ele controla. A partir daí, todo SMS chega para ele. O TOTP não é afetado, porque o segredo está no aparelho, não no número.
O WhatsApp fica no meio do caminho: a conta também é vinculada ao número, mas o atacante precisa registrar o WhatsApp no chip novo, e o PIN da confirmação em duas etapas do próprio WhatsApp bloqueia esse registro quando o usuário o ativou. Mesmo assim, para contas de alto valor, trate o código por mensagem como fator mais fraco que o TOTP.
Phishing. Nenhum dos dois resiste a um ataque em tempo real: uma página falsa pede o código (do autenticador ou do SMS) e o repassa ao site verdadeiro em segundos. Só fatores ligados à origem, como passkeys e chaves FIDO2, são resistentes a phishing. Dois cuidados reduzem o dano: expiração curta e, na mensagem, o nome do app com a frase "nunca compartilhe este código".
Perda ou troca do celular. Aqui o cenário se inverte: quem perde o aparelho com o autenticador e não guardou os códigos de backup fica trancado para fora, e o suporte precisa de uma recuperação manual. Com o código por mensagem, basta recuperar o chip na operadora. Por isso a regra de ouro vale para qualquer método: gere códigos de backup na ativação e mostre-os uma única vez.
Adoção e suporte ao usuário
Segurança no papel não vale nada se o usuário desliga o 2FA na primeira semana. E a adoção é o ponto mais fraco do TOTP: exige instalar um app, escanear um QR code, entender o "código que muda a cada 30 segundos" e guardar backups. Para um público técnico isso é trivial; para o público geral de um marketplace ou de um app de delivery, é um funil cheio de abandono.
O código por WhatsApp ou SMS tem fricção quase zero: o usuário já faz isso no banco e na rede social, não há nada para instalar nem para perder, e a mensagem chega no canal que ele abre dezenas de vezes por dia.
No suporte, os tickets mudam de natureza:
| Situação | TOTP | WhatsApp/SMS |
|---|---|---|
| "Troquei de celular" | Recuperação manual, exige backup codes | Funciona sem ação |
| "Não recebi o código" | Não acontece | Verificar canal, reenvio com limite |
| "Meu relógio está errado" | Código inválido até ajustar | Não acontece |
| "Perdi o número" | Não afeta | Exige troca de contato com nova verificação |
Meça a taxa de conclusão da ativação por método. Se o TOTP for o único caminho, uma parcela dos usuários simplesmente não vai ativar o segundo fator — e um 2FA desativado protege menos que qualquer SMS.
Custo e implementação: TOTP ou SMS no código
O TOTP tem custo marginal zero: nenhuma mensagem é enviada, nenhum provedor é pago por uso. O custo está no desenvolvimento (ativação com QR code, backup codes, fluxo de recuperação) e no suporte.
O código por mensagem tem um custo por envio, que varia por canal e país, e um custo de integração menor quando você usa uma API pronta em vez de negociar com operadoras. Vale olhar o modelo de cobrança: na aut2fa, o plano é pré-pago sem assinatura, o WhatsApp é cobrado na entrega ou leitura e o SMS quando o provedor aceita a mensagem. Os valores atuais estão na página de preços.
Em ambos os casos, o segundo fator termina do mesmo jeito: com a emissão da sessão. Só crie o token de acesso depois que o fator foi validado, nunca antes. Se sua API usa JWT em Node.js com access e refresh token, o fluxo fica em dois passos: a senha gera um token temporário que só serve para a etapa de 2FA, e o código válido troca esse token temporário pelo par definitivo.
Três pontos aparecem na implementação de qualquer um dos métodos:
- Limite de tentativas: cinco erros devem bloquear o código e exigir um novo. Uma API de verificação faz isso por padrão e devolve as tentativas restantes (
attempts_left) para você mostrar na tela. - Expiração: códigos por mensagem valem por minutos (dez por padrão na aut2fa), e o campo
expires_atalimenta o contador na interface. - Rate limit: reenvios ilimitados viram custo e vetor de abuso. Respeite o
Retry-Afterquando receber HTTP 429 e desabilite o botão até lá.
Recomendação por tipo de app
A pergunta certa na hora de escolher entre TOTP ou SMS não é "qual é o mais seguro", e sim "qual combinação meu usuário vai manter ativada". A tabela abaixo resume o que costuma funcionar:
| Tipo de aplicação | Fator principal | Fator secundário |
|---|---|---|
| Fintech, cripto, painéis administrativos | TOTP (ou passkey) | Código por mensagem só para recuperação |
| SaaS B2B com dados de clientes | TOTP opcional, incentivado | Código por mensagem como padrão |
| Marketplace, delivery, apps de consumo | Código por WhatsApp/SMS | TOTP para quem quiser |
| Contas de criadores e influenciadores | TOTP + backup codes | Código por mensagem com alerta de troca de número |
Contas de criadores merecem atenção especial: concentram audiência, receita e integrações, e são alvo frequente de SIM swap. O guia de segurança para streamers do Live Copiloto mostra, do lado do criador, o que exigir das plataformas — e, do lado de quem desenvolve, o que oferecer.
O desenho que melhor equilibra segurança e adoção costuma ser este:
- Verificar o telefone no cadastro com código por mensagem (elimina contas falsas e cria um canal de recuperação).
- Ativar o 2FA por mensagem por padrão, sem pedir nada além do que o usuário já fez.
- Oferecer o TOTP como "proteção avançada", com códigos de backup obrigatórios.
- Em ações sensíveis (troca de senha ou telefone, saque), exigir o fator mais forte que a conta tiver.
Perguntas frequentes
TOTP é mais seguro que SMS?
Contra SIM swap e interceptação de mensagens, sim: o segredo do TOTP fica no aparelho e nunca trafega. Contra phishing em tempo real, os dois são igualmente vulneráveis. E o TOTP só protege se o usuário de fato o ativa e guarda os backups.
Posso usar o WhatsApp como segundo fator em vez do SMS?
Pode, e para o público brasileiro costuma ser a melhor escolha: entrega rápida, confirmação de leitura e, em geral, custo menor por envio. Com uma API multicanal que tenta os canais do mais barato ao mais caro, o WhatsApp fica como preferência e o SMS como fallback sem mudar o código.
O que fazer quando o usuário perde o celular com o Google Authenticator?
Use os códigos de backup gerados na ativação. Se ele não os tiver, a recuperação deve ser mais rigorosa que o login normal: confirmação por um segundo canal já verificado, período de espera e aviso em todos os canais. Nunca desative o 2FA só com base em um e-mail pedindo isso.
Passkeys substituem TOTP e SMS?
Para login, passkeys são a opção mais resistente a phishing e já funcionam nos principais navegadores e sistemas. Ainda assim, você vai precisar de um canal de recuperação e de um fator para dispositivos sem suporte — e aí o código por mensagem continua sendo a opção mais simples.
Próximos passos
Se o seu produto ainda não tem segundo fator, comece pelo código por mensagem: é o que a maior parte dos usuários vai ativar. Depois, adicione o TOTP como camada opcional para quem precisa.
Para testar o fluxo por mensagem sem gastar nada, crie uma aplicação em modo de teste no painel da aut2fa, use o código 000000 e siga o quickstart da documentação. O mesmo código que roda em teste vai para produção trocando apenas a chave.