SMS OTP: Como Implementar Autenticação de Dois Fatores por SMS
O SMS OTP (One-Time Password) é uma das formas mais eficazes de adicionar uma camada extra de segurança a sistemas e aplicações. O código de verificação enviado por SMS é usado em login, confirmação de transações, recuperação de senhas e qualquer momento em que você precise confirmar que a pessoa é realmente quem diz ser.
Neste guia, você vai entender como funciona o OTP por SMS, como implementar no seu sistema e quais são as melhores práticas de segurança.
O que é SMS OTP?
OTP significa One-Time Password — senha de uso único. É um código numérico (geralmente de 4 a 8 dígitos) gerado aleatoriamente e enviado por SMS para o número de celular cadastrado do usuário. Ele é válido apenas por um período curto (geralmente 5 a 10 minutos) e só pode ser usado uma vez.
O SMS OTP é amplamente utilizado como segundo fator de autenticação (2FA — Two-Factor Authentication). Combinado com a senha convencional, ele protege a conta mesmo que a senha seja comprometida: o atacante precisaria também ter acesso ao celular físico do usuário.
Exemplos de uso cotidiano
- Internet banking: código SMS para confirmar transferências e pagamentos
- E-commerce: verificação ao cadastrar novo método de pagamento
- Apps de delivery: confirmação de pedido por SMS
- Redes sociais: verificação de identidade ao fazer login de novo dispositivo
- Serviços de governo: acesso ao Gov.br, eSocial, INSS
- Telemedicina: autenticação em prontuários eletrônicos
Como Funciona o SMS OTP?
O fluxo técnico do SMS OTP é simples e confiável:
1. Usuário solicita acesso
O usuário informa login e senha na sua aplicação e clica em "Entrar".
2. Sistema gera o OTP
Seu backend gera um código aleatório (ex: 6 dígitos) e o armazena temporariamente com um TTL (time-to-live) de 5-10 minutos.
3. Envio por SMS
O sistema chama a API de SMS (como a EnvioSMS) para enviar o código ao número do usuário:
POST /api/v1/sms/send
{
"to": "5534999999999",
"message": "Seu código de acesso é: 847293. Válido por 10 minutos. Não compartilhe."
}
4. Usuário insere o código
A tela exibe um campo para o usuário digitar o código recebido por SMS.
5. Validação
Seu sistema verifica se o código digitado corresponde ao gerado, dentro do prazo de validade.
6. Invalidação
Após uso bem-sucedido (ou expiração), o código é descartado. Cada nova autenticação gera um código diferente.
Implementando SMS OTP na Prática
Geração segura do código
Nunca use funções de número aleatório não seguras (Math.random() em JavaScript, rand() em PHP). Use sempre geradores criptograficamente seguros:
Node.js:
const crypto = require('crypto');
function generateOTP(length = 6) {
const max = Math.pow(10, length);
const randomBytes = crypto.randomBytes(4);
const randomInt = randomBytes.readUInt32BE(0);
return String(randomInt % max).padStart(length, '0');
}
// Exemplo: '084729'
Python:
import secrets
def generate_otp(length=6):
return str(secrets.randbelow(10**length)).zfill(length)
# Exemplo: '084729'
PHP:
function generateOTP($length = 6) {
return str_pad(random_int(0, pow(10, $length) - 1), $length, '0', STR_PAD_LEFT);
}
Armazenamento temporário
Armazene o OTP com TTL usando Redis (recomendado) ou banco de dados:
// Com Redis (Node.js)
const redis = require('redis');
const client = redis.createClient();
async function storeOTP(userId, otp) {
const key = `otp:${userId}`;
await client.setEx(key, 600, otp); // TTL: 600 segundos = 10 minutos
}
async function verifyOTP(userId, inputOtp) {
const key = `otp:${userId}`;
const storedOtp = await client.get(key);
if (!storedOtp || storedOtp !== inputOtp) return false;
await client.del(key); // Invalida após uso
return true;
}
Envio via API EnvioSMS
const axios = require('axios');
async function sendOTPSMS(phoneNumber, otp) {
await axios.post(
'https://api.enviosms.com.br/v1/sms/send',
{
to: phoneNumber,
message: `Seu código de verificação é: ${otp}. Válido por 10 minutos. Nunca compartilhe este código.`
},
{
headers: {
'Authorization': `Bearer ${process.env.ENVIOSMS_API_KEY}`,
'Content-Type': 'application/json'
}
}
);
}
Boas Práticas de Segurança no SMS OTP
Limite de tentativas (Rate Limiting)
Bloqueie a conta temporariamente após 3-5 tentativas erradas consecutivas. Isso previne ataques de força bruta.
async function checkAttempts(userId) {
const key = `otp_attempts:${userId}`;
const attempts = await redis.incr(key);
if (attempts === 1) await redis.expire(key, 300); // 5 min de janela
return attempts > 5; // true = bloqueado
}
Validade curta
5 a 10 minutos é o ideal. Nunca ultrapasse 30 minutos para OTP.
Código de comprimento adequado
6 dígitos é o padrão atual. 4 dígitos são mais fáceis de forçar (apenas 10.000 combinações).
Invalidação imediata após uso
O código deve ser descartado imediatamente após validação bem-sucedida.
Não reutilize OTPs
Cada nova solicitação deve gerar um código completamente novo, invalidando o anterior.
Mensagem segura
A mensagem SMS deve ser clara sobre o contexto e alertar o usuário para nunca compartilhar o código:
Boas práticas:
[SuaEmpresa] Código: 847293. Válido 10 min. NUNCA compartilhe.Verificação EnvioSMS: 847293. Se não foi você, ignore.
Evitar:
- Não mencionar para qual serviço é (confuso e perigoso)
- Incluir links na mesma mensagem (risco de phishing)
Detecção de SIM Swap
O ataque de SIM swap consiste em um atacante convencer a operadora a transferir o número da vítima para um novo SIM card. Para mitigar:
- Combine SMS OTP com outros fatores (email, app authenticator)
- Para operações de alto risco (transferências bancárias grandes), use OTP por app em vez de SMS
- Implemente verificações adicionais se o número de destino do SMS mudou recentemente
SMS OTP vs Outros Métodos de 2FA
| Método | Facilidade de uso | Custo | Segurança | Adoção |
|---|---|---|---|---|
| SMS OTP | ⭐⭐⭐⭐⭐ | Baixo | ⭐⭐⭐ | Muito alta |
| App Authenticator (TOTP) | ⭐⭐⭐ | Zero | ⭐⭐⭐⭐⭐ | Média |
| Email OTP | ⭐⭐⭐⭐ | Zero | ⭐⭐ | Alta |
| Hardware Token | ⭐⭐ | Alto | ⭐⭐⭐⭐⭐ | Baixa |
| Biometria | ⭐⭐⭐⭐⭐ | Médio | ⭐⭐⭐⭐ | Crescente |
Quando usar SMS OTP:
- Quando a base de usuários inclui pessoas pouco familiarizadas com apps autenticadores
- Em setores como varejo, delivery e serviços que precisam de fluxo simples
- Como fator adicional em processos de recuperação de senha
- Para confirmação de transações financeiras de médio risco
Casos de Uso por Setor
E-commerce
- Login em novo dispositivo
- Alteração de endereço de entrega
- Compra com cartão de crédito novo
- Recuperação de senha
Financeiro / Fintechs
- Autorização de TED e PIX
- Aumento de limite
- Cadastro de chave PIX
- Acesso ao internet banking
Saúde
- Acesso a prontuários eletrônicos
- Confirmação de teleconsulta
- Liberação de receita digital
SaaS e Tecnologia
- Login de novo dispositivo ou localização incomum
- Alteração de dados críticos (e-mail, senha)
- Autorização de mudanças em ambientes de produção
Volume e Custos do SMS OTP
O SMS OTP é geralmente enviado sob demanda (SMS transacional), com volume atrelado diretamente ao uso da aplicação. Para dimensionar:
- E-commerce com 10.000 pedidos/mês: ~3.000-5.000 OTPs (não são todos que usam 2FA)
- App financeiro com 50.000 transações/mês: ~30.000-40.000 OTPs
- SaaS com 5.000 usuários ativos: ~500-2.000 OTPs/mês (logins em novos dispositivos)
Com a EnvioSMS a R$0,10/SMS, o custo de OTP para 10.000 mensagens é de apenas R$1.000/mês — um investimento mínimo para um nível de segurança significativo.
EnvioSMS para SMS OTP: Confiabilidade Que Seu Sistema Exige
Para autenticação, a entregabilidade não pode falhar. Seu usuário precisa receber o código em segundos, não minutos.
✅ Latência < 200ms na API para envio imediato
✅ Shortcode oficial com tratamento prioritário nas operadoras
✅ 98%+ de entregabilidade — o código chega na hora
✅ Webhooks de delivery — saiba exatamente quando o código foi entregue
✅ SLA 99.9% — sua autenticação nunca para
✅ Sandbox gratuito para desenvolvimento e testes
Integre SMS OTP ao seu sistema hoje e ofereça a seus usuários uma camada de segurança que funciona em qualquer celular, sem depender de apps ou internet.