Autenticação de Dois Fatores e Segurança de Senhas
Você criou uma aplicação web e os usuários estão se cadastrando. Mas as contas deles estão realmente seguras? Senhas fracas e a ausência de autenticação de dois fatores (2FA) estão entre as formas mais fáceis de invasores acessarem contas. Neste guia, vamos abordar práticas recomendadas, práticas e atemporais, para segurança de senhas e 2FA que você pode implementar hoje mesmo.
Por que a Segurança de Senhas Ainda Importa
Apesar de anos de alertas, as senhas continuam sendo o principal método de autenticação para a maioria das aplicações web. Os invasores sabem disso e atacam senhas por meio de phishing, credential stuffing e força bruta. Uma única senha comprometida pode levar ao roubo de conta, roubo de dados e danos à reputação.
Políticas de senhas fortes e 2FA elevam significativamente a barra para os invasores. Vejamos como fazer ambos corretamente.
Armazenamento de Senhas: Hashing Feito Corretamente
Nunca armazene senhas em texto puro. Sempre faça o hash delas com um algoritmo forte e lento, projetado para senhas. Hashes rápidos como SHA-256 não são adequados porque permitem ataques de força bruta rápidos.
Algoritmos recomendados:
- Argon2id – Vencedor da Password Hashing Competition, resistente a ataques de GPU e de canal lateral.
- bcrypt – Amplamente suportado, testado em batalha e lento por design.
- scrypt – Memory-hard, bom para prevenir ataques acelerados por hardware.
Exemplo usando bcrypt no Node.js:
const bcrypt = require('bcrypt');
const saltRounds = 12;
async function hashPassword(password) {
return await bcrypt.hash(password, saltRounds);
}
async function verifyPassword(password, hash) {
return await bcrypt.compare(password, hash);
}
Sempre use um salt único por senha (a maioria das bibliotecas faz isso automaticamente). Ajuste o fator de custo para que o hashing leve ~100-500ms no seu servidor.
Políticas de Senhas Que Realmente Ajudam
Esqueça regras complexas como "deve incluir um símbolo e um número". A orientação moderna (NIST SP 800-63B) recomenda:
- Comprimento mínimo de 8 caracteres, mas incentive passphrases (ex.: 4+ palavras aleatórias).
- Verifique contra listas de senhas vazadas (ex.: API Have I Been Pwned).
- Sem expiração periódica forçada, a menos que haja suspeita de comprometimento.
- Permita todos os caracteres ASCII imprimíveis e espaços.
- Limite a taxa de tentativas de login para prevenir força bruta.
Implemente um medidor de força simples que dê feedback sem bloquear senhas legítimas.
Métodos de Autenticação de Dois Fatores (2FA)
O 2FA adiciona um segundo fator: algo que você tem (telefone, chave de hardware) ou algo que você é (biometria). Aqui estão os métodos comuns, classificados por segurança:
| Método | Segurança | Usabilidade |
|---|---|---|
| Chaves de segurança de hardware (WebAuthn/FIDO2) | Alta | Média |
| Aplicativos autenticadores (TOTP) | Alta | Alta |
| Notificações push | Média | Alta |
| Códigos por SMS | Baixa | Alta |
O SMS é vulnerável a SIM swapping e interceptação. Prefira TOTP ou WebAuthn quando possível.
Implementando 2FA Baseado em TOTP
TOTP (Time-based One-Time Password) é um ótimo equilíbrio entre segurança e usabilidade. Aqui está um fluxo de alto nível:
- Gere uma chave secreta para o usuário (ex.: 32 bytes aleatórios, codificados em base32).
- Crie uma URI otpauth:// e exiba um QR code para o usuário escanear com um aplicativo autenticador.
- Verifique se o usuário consegue gerar um código válido antes de ativar o 2FA.
- Armazene o segredo com segurança (criptografado em repouso).
- Forneça códigos de backup para recuperação de conta.
Durante o login, após verificar a senha, solicite o código TOTP. Verifique-o com uma biblioteca como otplib ou speakeasy.
const { authenticator } = require('otplib');
// Generate secret
const secret = authenticator.generateSecret();
// Verify token
const isValid = authenticator.verify({ token: userToken, secret });
Permita uma pequena janela de tempo (ex.: ±1 intervalo) para compensar o desvio de relógio.
WebAuthn: O Futuro da Autenticação
WebAuthn (parte do FIDO2) permite autenticação sem senha e como segundo fator usando chaves de hardware ou autenticadores de plataforma (Touch ID, Windows Hello). É resistente a phishing porque a credencial é vinculada à origem.
Implementar WebAuthn requer:
- Geração e verificação de challenge no lado do servidor.
- JavaScript no lado do cliente usando a API WebAuthn.
- Armazenar chaves públicas e IDs de credencial para cada usuário.
Bibliotecas como SimpleWebAuthn facilitam isso. Embora mais complexo que o TOTP, o WebAuthn oferece a proteção mais forte.
Rate Limiting e Bloqueio de Conta
Mesmo com 2FA, você deve prevenir ataques de força bruta em senhas. Implemente:
- Rate limiting por IP e por conta (ex.: 5 tentativas por minuto).
- Backoff exponencial após tentativas falhas.
- Bloqueio de conta após falhas repetidas, com um processo de desbloqueio seguro (ex.: verificação por e-mail).
- CAPTCHA após algumas falhas.
Cuidado para não bloquear permanentemente usuários legítimos; use bloqueios temporários e notifique o usuário.
Redefinição de Senha Segura
Fluxos de redefinição de senha são um vetor de ataque comum. Siga estas regras:
- Use um token de uso único e com tempo limitado, enviado por e-mail.
- Não revele se um e-mail existe no sistema.
- Exija que o usuário se autentique novamente se já estiver logado.
- Invalide todas as sessões após uma redefinição de senha.
Educando Usuários Sem Culpá-los
Segurança é uma responsabilidade compartilhada. Forneça orientações claras:
- Use um gerenciador de senhas para gerar e armazenar senhas únicas.
- Ative o 2FA sempre que possível.
- Fique atento a tentativas de phishing.
Dicas no aplicativo e uma página dedicada à segurança podem ajudar.
FAQ
O 2FA por SMS é melhor do que nenhum 2FA?
Sim, o 2FA por SMS é melhor do que nada, mas é vulnerável a SIM swapping e interceptação. Prefira TOTP ou WebAuthn para maior segurança.
Com que frequência devo rotacionar algoritmos de hashing de senha?
Você não precisa rotacionar, a menos que uma vulnerabilidade seja encontrada. No entanto, você pode refazer o hash das senhas em logins bem-sucedidos quando atualizar parâmetros (ex.: aumentar o custo do bcrypt).
Posso usar 2FA com OAuth ou login social?
Sim, mas o 2FA normalmente é gerenciado pelo provedor de identidade. Se você usa login social, garanta que seu próprio processo de recuperação de conta seja seguro.
Pronto para melhorar a segurança da sua aplicação? Comece implementando hashing de senhas forte e 2FA baseado em TOTP hoje mesmo. Para mais ferramentas de desenvolvedor, confira nosso JSON Formatter para depurar respostas de API rapidamente.