// Segurança de OTP

Boas práticas de OTP: códigos, expiração, limites de taxa e canal reserva

Uma senha de uso único parece trivial: gere um número, envie por texto, confira. Mas os detalhes são onde vivem as falhas de roubo de conta. Este guia cobre as decisões que tornam um fluxo de OTP de fato seguro e usável: entropia do código, armazenamento, janelas de expiração, limitação de taxa, novas tentativas e canais reserva.

Gere códigos com entropia real

Use um gerador aleatório criptograficamente seguro, nunca uma semente previsível nem um valor derivado de um timestamp. Seis dígitos é o equilíbrio habitual entre segurança e usabilidade; códigos mais curtos precisam de limites de taxa mais rígidos para serem seguros.

Nunca envie o mesmo código duas vezes, nem torne um código adivinhável a partir de um id de usuário ou de uma sequência. Toda a segurança do OTP por SMS repousa em o código ser imprevisível durante sua curta vida.

  • Use um CSPRNG (por exemplo, bibliotecas secrets/crypto), não um PRNG de uso geral.
  • 6 dígitos é o padrão; se usar 4, aperte com força os limites de taxa e a expiração.
  • Um código por solicitação; invalide os códigos anteriores ao emitir um novo.

Armazene os códigos com segurança, nunca em texto puro

Trate um OTP como uma senha de vida curta. Armazene um hash do código (com o identificador e a expiração) em vez do valor bruto, para que um vazamento do banco de dados não exponha códigos vivos. Compare com uma função de tempo constante para evitar ataques de temporização, e apague o registro assim que ele for usado ou expirar.

  • Aplique hash ao código antes de armazenar; compare em tempo constante.
  • Vincule cada código a um único usuário/sessão e propósito.
  • Apague ao ter sucesso, ao expirar ou ao atingir o teto de tentativas.

Defina uma janela de expiração curta

Os códigos devem viver minutos, não horas. Uma expiração de 5 a 10 minutos é a faixa habitual: suficiente para que um SMS atrasado ainda chegue, curta para que um código vazado já costume estar morto. Mostre a validade restante ao usuário para que uma mensagem lenta não pareça um fluxo quebrado.

!

Combine uma expiração curta com um tempo de espera de reenvio, ou os usuários vão martelar o reenvio quando uma mensagem atrasar e multiplicar seu custo de SMS.

Limite a taxa em todas as dimensões

A limitação de taxa é o que detém tanto a adivinhação por força bruta dos códigos quanto o abuso do seu endpoint de envio (que custa dinheiro e pode fazer marcarem o seu sender). Limite por número de telefone, por IP e por conta, tanto no envio quanto na verificação.

  • Tentativas de verificação: limite as tentativas por código (por exemplo, 5) e então invalide e force o reenvio.
  • Solicitações de envio: tempo de espera entre envios e um teto diário por número.
  • Barreiras globais: limites por IP e por conta para amortecer o abuso automatizado.
  • Adicione backoff exponencial ou CAPTCHA quando os limites forem atingidos repetidamente.

Lide com novas tentativas e canais reserva

SMS é de melhor esforço, então um bom fluxo pressupõe que algumas mensagens não chegarão. Ofereça um reenvio após um tempo de espera e, após uma ou duas tentativas de SMS falhas, escale para um canal reserva — uma chamada de voz que lê o código, WhatsApp ou e-mail — que é exatamente o que as Verify APIs gerenciadas automatizam.

Torne os estados de falha humanos: uma via clara de "não recebeu?", uma forma de trocar o número e contato com o suporte após falhas repetidas.

  1. 1

    Primeira tentativa: SMS

    Envie o código e inicie uma contagem regressiva visível com um tempo de espera de reenvio.

  2. 2

    Reenvio a pedido

    Permita um reenvio após o tempo de espera; invalide o código anterior ao emitir um novo.

  3. 3

    Escale de canal

    Após falhas de SMS repetidas, ofereça voz ou um canal alternativo para entregar a mesma verificação.

  4. 4

    Ofereça uma saída

    Deixe o usuário corrigir o número ou chegar ao suporte em vez de ficar em um beco sem saída.

Melhore a UX sem enfraquecer a segurança

Pequenos detalhes elevam as taxas de conclusão: use a WebOTP API e os formatos de preenchimento automático de SMS para que os navegadores mobile leiam o código, mantenha uma redação de mensagem consistente (algumas plataformas fazem cache de senders confiáveis) e não inclua nada além do código e do nome do seu app. Evite links nas mensagens de OTP: acostumam os usuários a clicar e disparam os filtros de spam de operadora.

  • Suporte WebOTP / preenchimento automático de código de uso único no mobile.
  • Mantenha a mensagem mínima: nome do app + código, sem marketing, sem links.
  • Localize o texto da mensagem, mas mantenha estável o formato do código.

Perguntas frequentes

Por quanto tempo um OTP deve ser válido?+

De cinco a dez minutos é a janela habitual. É o suficiente para sobreviver a um SMS atrasado, mas curta para que um código vazado já costume estar expirado. Mostre sempre o tempo restante para que uma mensagem lenta não pareça um fluxo quebrado.

Quantas tentativas de verificação devo permitir?+

Limite as tentativas por código a cerca de cinco, então invalide o código e exija um novo envio. Combine isso com limites de taxa por número, por IP e por conta tanto no envio quanto na verificação para deter a força bruta e o abuso do endpoint de envio.

Devo colocar um link na mensagem de OTP?+

Não. Mantenha as mensagens de OTP apenas com o nome do seu app e o código. Links acostumam os usuários a clicar, podem vazar o código pelos referrers e disparam com frequência a filtragem de spam de operadora, que prejudica a entregabilidade.

O OTP por SMS é seguro o suficiente sozinho?+

O OTP por SMS é um salto significativo em relação a só senhas, mas é vulnerável a SIM swaps e interceptação. Para contas de alto valor, ofereça fatores mais fortes como passkeys ou TOTP e trate o SMS como reserva; consulte o guia de alternativas ao OTP.

EdgeGigs

Implemente seu fluxo de OTP certo de primeira.

Contrate no EdgeGigs um desenvolvedor verificado para construir geração de códigos segura, expiração, limitação de taxa e canal reserva no seu app web ou mobile.

Encontre um desenvolvedor no EdgeGigs