
Proteger senhas, contas e projetos: hashing, gerenciadores e rotação de segredos
Proteger senhas envolve duas frentes distintas: as suas, como profissional, e as dos usuários da aplicação que você desenvolve. As duas falham por motivos diferentes e exigem soluções diferentes. Este guia cobre gerenciamento pessoal, armazenamento correto no servidor, políticas de senha segundo recomendações atuais e gestão de segredos em projetos.
Parte 1 — Suas contas
O maior risco individual é reutilização de senha. Quando um serviço qualquer sofre vazamento, atacantes testam automaticamente a mesma combinação em dezenas de outros serviços, técnica conhecida como credential stuffing. Um gerenciador de senhas elimina a raiz do problema ao permitir uma senha diferente em cada lugar sem esforço de memória.
| Prática | Por quê | Prioridade |
|---|---|---|
| Senha única por serviço | Isola o dano de qualquer vazamento | Alta |
| Senha mestre longa (frase) | Comprimento vale mais que símbolos | Alta |
| Passkey onde disponível | Resistente a phishing por vínculo com o domínio | Alta |
| 2FA por app ou chave física | SMS é vulnerável a troca de chip | Alta |
| Códigos de recuperação offline | Evita perder acesso ao trocar de celular | Média |
| Revisão de sessões e apps conectados | Remove acessos antigos esquecidos | Média |
Uma frase de quatro a cinco palavras aleatórias supera em entropia a maioria das senhas curtas com símbolos, e é muito mais fácil de digitar corretamente. Evite frases de músicas ou citações conhecidas, que aparecem em listas de ataque.
Parte 2 — Senhas dos seus usuários
Senha nunca é armazenada em texto puro nem criptografada de forma reversível. Ela passa por uma função de hash lenta, projetada para tornar a tentativa em massa cara. As opções recomendadas hoje são Argon2id, scrypt e bcrypt, nessa ordem de preferência.
| Algoritmo | Status | Observação |
|---|---|---|
| Argon2id | Recomendado | Resistente a GPU e ASIC por uso de memória |
| scrypt | Aceitável | Também custoso em memória |
| bcrypt | Aceitável | Maduro; limite de 72 bytes na entrada |
| PBKDF2 | Só por exigência de conformidade | Pouca resistência a hardware dedicado |
| SHA-256 puro / MD5 | Inaceitável | Rápido demais; quebra em massa é trivial |
import { hash, verify } from "@node-rs/argon2";
const PARAMETROS = {
memoryCost: 19456, // ~19 MiB, mínimo sugerido pela OWASP
timeCost: 2,
parallelism: 1,
};
export async function criarHashDeSenha(senha: string): Promise<string> {
// O salt é gerado automaticamente e embutido no hash resultante
return hash(senha, PARAMETROS);
}
export async function conferirSenha(hashArmazenado: string, senha: string) {
try {
return await verify(hashArmazenado, senha);
} catch {
return false; // hash corrompido ou formato inválido
}
}Nunca implemente sua própria função de hash nem invente esquemas como "SHA-256 aplicado três vezes com sal secreto". Use bibliotecas mantidas e parâmetros recomendados; criptografia caseira falha de formas difíceis de detectar.
Políticas de senha que ajudam (e as que atrapalham)
As diretrizes atuais do NIST inverteram várias práticas antigas. Regras de composição rígidas e troca periódica obrigatória produzem senhas previsíveis, com incremento de número no final. O que funciona é comprimento mínimo, verificação contra listas de senhas vazadas e troca apenas quando há suspeita de comprometimento.
| Regra antiga | Recomendação atual | Motivo |
|---|---|---|
| Trocar a cada 90 dias | Trocar só em suspeita de vazamento | Rotação forçada gera padrões fracos |
| Exigir símbolo e maiúscula | Exigir comprimento mínimo de 8 a 12 | Composição rígida reduz variedade real |
| Bloquear colar no campo | Permitir colar | Habilita uso de gerenciador |
| Limitar a 16 caracteres | Aceitar pelo menos 64 | Frases longas são mais seguras |
| Perguntas secretas | Códigos de recuperação ou e-mail verificado | Respostas são pesquisáveis publicamente |
// Verificação contra vazamentos usando k-anonimato: apenas 5 caracteres
// do hash SHA-1 saem do servidor; a senha nunca é transmitida.
export async function senhaJaVazou(senha: string): Promise<boolean> {
const dados = new TextEncoder().encode(senha);
const digest = await crypto.subtle.digest("SHA-1", dados);
const sha1 = [...new Uint8Array(digest)]
.map((b) => b.toString(16).padStart(2, "0"))
.join("")
.toUpperCase();
const prefixo = sha1.slice(0, 5);
const sufixo = sha1.slice(5);
const resposta = await fetch(`https://api.pwnedpasswords.com/range/${prefixo}`);
const texto = await resposta.text();
return texto.split("\n").some((linha) => linha.split(":")[0] === sufixo);
}Proteções no fluxo de autenticação
- Limite de tentativas por conta e por endereço de origem, com atraso progressivo em vez de bloqueio permanente.
- Mensagem de erro genérica no login: revelar que o e-mail existe facilita enumeração de usuários.
- Comparação em tempo constante ao verificar tokens; a própria biblioteca de hash já cuida disso para senhas.
- Token de redefinição de senha aleatório, com validade curta e uso único, armazenado como hash.
- Invalidação de todas as sessões após troca de senha.
- Notificação por e-mail em login de novo dispositivo e em alteração de credenciais.
Parte 3 — Segredos em projetos
Chave de API em repositório é um dos vazamentos mais comuns e mais fáceis de evitar. Segredos ficam em variáveis de ambiente ou em um cofre gerenciado, com escopo mínimo e prazo de validade sempre que a plataforma permitir.
# Estrutura recomendada
.env # local, NUNCA versionado
.env.example # versionado, apenas nomes das variáveis, sem valores
# .env.example
DATABASE_URL=
STRIPE_SECRET_KEY=
SMTP_PASSWORD=
# Verificar histórico antes de tornar um repositório público
git log --all -p -- .env | head -20
# Se uma chave vazou: revogue primeiro, limpe o histórico depois
# 1) revogar no painel do provedor
# 2) gerar nova chave e atualizar o ambiente
# 3) reescrever o histórico e forçar atualização em todos os clones| Tipo de segredo | Rotação sugerida | Escopo |
|---|---|---|
| Chave de API de terceiros | A cada 6–12 meses ou ao sair alguém do time | Somente as permissões usadas |
| Token de acesso pessoal | 90 dias com expiração automática | Repositórios específicos |
| Senha de banco de dados | Anual e imediatamente em incidente | Usuário por aplicação |
| Chave de assinatura de sessão | Anual, com suporte a duas chaves na transição | Aplicação |
| Credencial de serviço em nuvem | Preferir identidade temporária | Menor privilégio possível |
Ative varredura de segredos no seu provedor de repositórios e adicione um verificador no pipeline. Descobrir a chave exposta em minutos, e não em semanas, é o que separa um susto de um incidente com dados de clientes.
Conclusão
Nas suas contas, o essencial é senha única por serviço, gerenciador confiável e segundo fator resistente a phishing. Na aplicação, é Argon2id com parâmetros adequados, política baseada em comprimento e verificação de vazamento, além de proteções no fluxo de login. Nos projetos, é segredo fora do repositório, escopo mínimo e rotação planejada. São poucas decisões, mas cada uma delas remove uma classe inteira de incidentes.
Perguntas frequentes
+Posso guardar senhas no navegador?
É melhor do que reutilizar senhas, e os navegadores modernos criptografam o cofre. Gerenciadores dedicados oferecem vantagens em compartilhamento, auditoria e uso entre sistemas diferentes.
+Passkeys substituem senhas de vez?
Estão caminhando para isso nos serviços que as adotam, porque eliminam phishing e reuso. Enquanto a adoção não é universal, a recomendação é usar passkey onde existir e manter senha forte com 2FA no restante.
+Qual o custo de processamento do Argon2 no servidor?
Com os parâmetros sugeridos pela OWASP, cada verificação leva algumas dezenas de milissegundos e consome memória proporcional à configuração. Ajuste os parâmetros ao seu hardware medindo o tempo real de verificação.
+É seguro usar autenticação de terceiros em vez de senha própria?
Sim, e frequentemente é mais seguro, porque delega o armazenamento de credenciais a provedores especializados. Cuide da vinculação de contas por e-mail e do que fazer quando o usuário perde acesso ao provedor.
Fontes consultadas
- OWASP — Password Storage Cheat Sheet
- NIST SP 800-63B — Digital Identity Guidelines
- MDN — Web Authentication API
Revisão editorial: publicado em . Última revisão em . Conteúdo educativo, sem patrocínio das ferramentas citadas.
Leia também

Segurança digital para quem trabalha online: ameaças reais e defesas práticas
Modelo de ameaças para profissionais remotos: phishing, contas comprometidas, dispositivos, redes públicas, backup e resposta a incidentes — com passos verificáveis.

LGPD para Desenvolvedores: Privacidade por Design no Código
Como implementar a Lei Geral de Proteção de Dados em aplicações: consentimento, minimização, pseudonimização, direitos do titular, registros de operações e boas práticas de segurança da informação.

LinkedIn para devs: perfil técnico, conteúdo e uso realista da rede
Como estruturar um perfil que aparece nas buscas de recrutadores técnicos, o que escrever em cada seção, como publicar sem virar influenciador e o que ignorar.