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.

Capa do artigo TOTP ou SMS/WhatsApp: qual 2FA escolher (Google Authenticator)

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.

Infográfico comparando TOTP e código por WhatsApp/SMS: TOTP funciona offline e sem custo por uso, a mensagem tem fricção quase zero, SIM swap afeta SMS mas não o TOTP, códigos de backup são obrigatórios e o ideal é oferecer os dois métodos.

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çãoTOTPWhatsApp/SMS
"Troquei de celular"Recuperação manual, exige backup codesFunciona sem ação
"Não recebi o código"Não aconteceVerificar canal, reenvio com limite
"Meu relógio está errado"Código inválido até ajustarNão acontece
"Perdi o número"Não afetaExige 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_at alimenta o contador na interface.
  • Rate limit: reenvios ilimitados viram custo e vetor de abuso. Respeite o Retry-After quando 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çãoFator principalFator secundário
Fintech, cripto, painéis administrativosTOTP (ou passkey)Código por mensagem só para recuperação
SaaS B2B com dados de clientesTOTP opcional, incentivadoCódigo por mensagem como padrão
Marketplace, delivery, apps de consumoCódigo por WhatsApp/SMSTOTP para quem quiser
Contas de criadores e influenciadoresTOTP + backup codesCó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:

  1. Verificar o telefone no cadastro com código por mensagem (elimina contas falsas e cria um canal de recuperação).
  2. Ativar o 2FA por mensagem por padrão, sem pedir nada além do que o usuário já fez.
  3. Oferecer o TOTP como "proteção avançada", com códigos de backup obrigatórios.
  4. 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.

Continue lendo