Quase todo formulário de cadastro exige maiúscula, minúscula, número e símbolo. Quase todo usuário responde com a mesma coisa: uma palavra conhecida, a primeira letra em maiúscula, um número no fim e um ponto de exclamação. A regra foi cumprida e a senha continua entre as primeiras que qualquer ataque tenta.
A medida que explica esse descompasso é a entropia. Ela não mede se a senha parece complicada — mede quantas tentativas um atacante precisa fazer, em média, para encontrá-la.
O cálculo
Para uma senha em que cada caractere é sorteado de forma independente e uniforme, a entropia em bits é o comprimento multiplicado pelo logaritmo na base 2 do tamanho do alfabeto.
| Alfabeto | Tamanho | Bits por caractere |
|---|---|---|
| Apenas dígitos | 10 | 3,32 |
| Letras minúsculas | 26 | 4,70 |
| Alfanumérico sem distinção de caixa | 36 | 5,17 |
| Alfanumérico com distinção de caixa | 62 | 5,95 |
| Todos os imprimíveis ASCII | 94 | 6,55 |
A consequência é direta: cada caractere a mais adiciona entre 3 e 7 bits, enquanto ampliar o alfabeto de 62 para 94 símbolos adiciona apenas 0,6 bit por caractere. Comprimento é a alavanca; variedade de símbolos é o ajuste fino.
| Comprimento | Entropia aproximada | Adequação |
|---|---|---|
| 8 caracteres | 52 bits | Insuficiente contra ataque offline |
| 12 caracteres | 78 bits | Razoável para conta comum com segundo fator |
| 16 caracteres | 105 bits | Confortável, inclusive offline |
| 24 caracteres | 157 bits | Adequado para chave e senha mestra |
Por que a regra de complexidade falha
As pessoas satisfazem a regra de forma previsível, e o atacante sabe disso. As listas de ataque modernas não testam combinações aleatórias: elas partem de senhas vazadas reais e aplicam transformações.
- A maiúscula vai quase sempre na primeira letra.
- O número vai quase sempre no fim, e costuma ser 1, 123 ou um ano.
- O símbolo vai depois do número, e costuma ser ! ou @.
- As substituições visuais — a por @, e por 3, i por 1, o por 0 — estão em toda regra de ataque há décadas.
- A palavra-base vem de um dicionário, do nome do serviço ou de algo pessoal e público.
O resultado é que uma senha de oito caracteres que cumpre todos os requisitos costuma cair em minutos num ataque offline, enquanto uma sequência de quatro palavras aleatórias, sem símbolo nenhum, resiste muito mais.
Ataque online e ataque offline
A quantidade de entropia necessária depende inteiramente de qual dos dois cenários se aplica — e é aqui que a maioria das discussões sobre senha se perde.
| Aspecto | Ataque online | Ataque offline |
|---|---|---|
| Onde ocorre | Contra o serviço em produção | Contra um vazamento de hashes |
| Velocidade | Limitada por rede e bloqueio | Bilhões de tentativas por segundo |
| Defesa principal | Limite de tentativas e segundo fator | Hash lento e entropia alta |
| Entropia confortável | 40 a 60 bits | Acima de 100 bits |
É por isso que a escolha do algoritmo de hash no servidor importa tanto quanto a senha do usuário. Um hash rápido como SHA-256 puro permite bilhões de tentativas por segundo em hardware comum; um hash desenhado para ser lento e consumir memória — Argon2id, scrypt ou bcrypt — reduz isso em várias ordens de grandeza.
import argon2 from "argon2";
// Parâmetros de custo: memória, iterações e paralelismo.
// Ajuste até que o hash leve entre 200 e 500 ms no seu hardware.
const OPCOES = {
type: argon2.argon2id,
memoryCost: 65536, // 64 MB
timeCost: 3,
parallelism: 4
};
export function gerarHash(senha) {
return argon2.hash(senha, OPCOES);
}
export function conferir(hash, senha) {
return argon2.verify(hash, senha);
}Recomendações práticas
- 1Exija comprimento mínimo generoso, entre 12 e 14 caracteres, e não exija composição obrigatória de tipos.
- 2Aceite espaço e qualquer caractere Unicode; regras que proíbem símbolos costumam existir por limitação antiga de banco, não por segurança.
- 3Não limite o comprimento máximo abaixo de 64 caracteres — um limite baixo denuncia que a senha talvez não esteja sendo hasheada.
- 4Verifique a senha contra listas de vazamento conhecidas no momento do cadastro, não meses depois.
- 5Use Argon2id, scrypt ou bcrypt com custo calibrado, nunca um hash rápido de propósito geral.
- 6Ofereça segundo fator e trate-o como a defesa real contra ataque online.
- 7Troque a senha quando houver indício de comprometimento, e não por calendário.
Gerando senhas com entropia previsível
A vantagem de uma senha gerada por máquina é que a fórmula de entropia volta a valer: se o sorteio é uniforme e a fonte de aleatoriedade é adequada, o número de bits é exatamente o que a conta diz.
O gerador de senha do Codigio Labs usa a API criptográfica do navegador, permite ajustar comprimento e conjunto de caracteres, e não envia nada a servidor algum — a senha existe apenas na aba aberta. Para contas reais, o complemento natural é um gerenciador de senhas, que remove a necessidade de memorizar o resultado.
Resumo
- Entropia é comprimento vezes bits por caractere, e só se aplica a caracteres realmente sorteados.
- Comprimento adiciona muito mais entropia do que ampliar o conjunto de símbolos.
- Regras de composição obrigatória produzem senhas previsíveis que os ataques já esperam.
- Ataque offline exige entropia muito maior; hash lento com salt é a contramedida do lado do servidor.
- Senha gerada por máquina e guardada em gerenciador é a combinação com melhor relação entre segurança e esforço.