O Que Torna uma Senha Forte
Uma senha forte gerada por maquina tem duas propriedades: alta entropia (imprevisibilidade) e sem padrões (sem palavras de dicionario, sem percursos de teclado, sem substituições).
A entropia e medida em bits. Cada bit duplica o número de senhas possíveis que um atacante precisa testar. Uma senha escolhida uniformemente ao acasó de um conjunto de N caracteres possíveis tem log2(N) bits de entropia por caractere.
| Conjunto de caracteres | Caracteres disponiveis | Entropia por caractere |
|---|---|---|
| Apenas minusculas | 26 | 4,7 bits |
| Minusculas + digitos | 36 | 5,2 bits |
| Maiusculas + minusculas + digitos | 62 | 5,9 bits |
| ASCII imprimivel completo | 95 | 6,6 bits |
Uma senha de 20 caracteres do conjunto ASCII imprimivel completo tem cerca de 130 bits de entropia. Uma senha de 20 caracteres limitada a apenas minusculas tem 94 bits. O conjunto de caracteres importa, mas o comprimento importa ainda mais: adicionar um caractere de um conjunto de 95 caracteres adiciona 6,6 bits de entropia. Dobrar o conjunto de caracteres de 26 para 95 adiciona apenas cerca de 1,9 bits por caractere.
NIST SP 800-63B Sobre Senhas
As diretrizes do NIST (atualizadas em 2024) merecem ser conhecidas porque contradizem a sabedoria convencional herdada sobre politicas de senhas:
- O comprimento é o fator mais importante. O NIST recomenda suportar senhas de pelo menos 64 caracteres.
- Regras de complexidade (exigir maiusculas, simbolos, digitos) são contraproducentes quando obrigatorias porque produzem padrões previsiveis (Password1! é o exemplo canonico de uma senha “complexa” mas fraca).
- A rotação forcada periodica enfraquece a seguranca ao treinar usuarios a fazerem pequenas mudancas previsiveis (Password1! vira Password2!).
- Listas negras de senhas (bloquear senhas conhecidas como comprometidas) são mais eficazes que regras de complexidade.
Para senhas geradas por maquina armazenadas em um gerenciador, nenhuma dessas restrições de politica importa. Use entropia máxima e comprimento máximo.
Entropia de Senha vs Passphrase
Uma senha aleatória de 20 caracteres é uma passphrase são ferramentas diferentes para situações diferentes.
Uma passphrase Diceware de 4 palavras (selecionadas aleatoriamente de 7776 palavras):
correct horse battery staple
Entropia: log2(7776^4) ≈ 51,7 bits por palavra × 4 = cerca de 207 bits. Mais entropia que uma senha aleatória de 20 caracteres.
Uma passphrase Diceware de 6 palavras tem cerca de 310 bits. Issó e inquebravei. Também e digitaivei e memorizavei, sendo a escolha certa para:
- Senhas mêstras de gerenciador de senhas
- Frases de cifragão de disco completo
- Frases de cifragão de chave SSH
- Qualquer coisa que você precise memorizar ou digitar sem preenchimento automatico
Use senhas de caracteres aleatórios para tudo armazenado no seu gerenciador. Use passphrases para as poucas credenciais que você precisa lembrar ou digitar regularmente.
Web Crypto API vs Math.random()
A diferença de implementação não e sutil:
// ERRADO: Math.random() não e criptográficamente seguro
function insecurePassword(length) {
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
return Array.from({ length }, () => chars[Math.floor(Math.random() * chars.length)]).join("");
}
// CORRETO: crypto.getRandomValues() é um CSPRNG
function securePassword(length) {
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*";
const array = new Uint32Array(length);
crypto.getRandomValues(array);
return Array.from(array, (n) => chars[n % chars.length]).join("");
}
A operação % chars.length introduz um pequeno vies de modulo quando o tamanho do conjunto de caracteres não divide uniformemente 2^32. Para um conjunto de 95 caracteres é um valor aleatório de 32 bits, o vies e insignificante na prática (os caracteres mais comuns aparecem cerca de 0,002% mais vezes que os menos comuns). Para uma implementação crítica de seguranca, use amostragem por rejeição para eliminar até mêsmo esse pequeno vies.
Como Esta Ferramenta Gera Senhas
O gerador executa inteiramente no seu navegador. Nenhuma senha e enviada a qualquer servidor. A fonte de aleatoriedade e crypto.getRandomValues() da Web Crypto API, que todos os navegadores modernos expoem é que obtem dados do CSPRNG do sistema operacional.
Apos a geração, copie a senha diretamente para seu gerenciador de senhas. Evite colar em locais intermediarios (rascunhos de email, aplicativos de notas, janelas de chat) onde o valor possa ser registrado ou sincronizado.