Segurança8 min de leitura

Entropia de senha: por que comprimento vence complexidade

O cálculo de entropia explicado, por que a regra de maiúscula-número-símbolo produz senhas piores do que promete, e o que muda quando o ataque é offline contra um vazamento de hashes.

Publicado em

AL

Por André Leitão

Desenvolvedor de software

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.

Bits por caractere segundo o alfabeto
AlfabetoTamanhoBits por caractere
Apenas dígitos103,32
Letras minúsculas264,70
Alfanumérico sem distinção de caixa365,17
Alfanumérico com distinção de caixa625,95
Todos os imprimíveis ASCII946,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.

Entropia total por comprimento, alfabeto de 94 caracteres
ComprimentoEntropia aproximadaAdequação
8 caracteres52 bitsInsuficiente contra ataque offline
12 caracteres78 bitsRazoável para conta comum com segundo fator
16 caracteres105 bitsConfortável, inclusive offline
24 caracteres157 bitsAdequado 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.

Dois cenários, duas exigências
AspectoAtaque onlineAtaque offline
Onde ocorreContra o serviço em produçãoContra um vazamento de hashes
VelocidadeLimitada por rede e bloqueioBilhões de tentativas por segundo
Defesa principalLimite de tentativas e segundo fatorHash lento e entropia alta
Entropia confortável40 a 60 bitsAcima 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.

Hash de senha com custo configurado
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

  1. 1Exija comprimento mínimo generoso, entre 12 e 14 caracteres, e não exija composição obrigatória de tipos.
  2. 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.
  3. 3Não limite o comprimento máximo abaixo de 64 caracteres — um limite baixo denuncia que a senha talvez não esteja sendo hasheada.
  4. 4Verifique a senha contra listas de vazamento conhecidas no momento do cadastro, não meses depois.
  5. 5Use Argon2id, scrypt ou bcrypt com custo calibrado, nunca um hash rápido de propósito geral.
  6. 6Ofereça segundo fator e trate-o como a defesa real contra ataque online.
  7. 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.

Perguntas frequentes

Como se calcula a entropia de uma senha?
Para uma senha gerada aleatoriamente, é o comprimento multiplicado pelo logaritmo na base 2 do tamanho do alfabeto. Uma senha de 12 caracteres sorteados entre 94 símbolos imprimíveis tem cerca de 78 bits. O cálculo só vale se os caracteres forem realmente sorteados — em senha escolhida por pessoa, ele superestima muito.
Quantos bits são suficientes?
Para uma senha protegida por um hash lento e por limite de tentativas, 60 bits já são desconfortáveis para o atacante. Para algo que pode acabar num vazamento e ser atacado offline — senha mestra de cofre, chave de backup, credencial de serviço — mire em 100 bits ou mais.
Trocar a por @ ajuda?
Quase nada. As listas de ataque aplicam essas substituições automaticamente há décadas. Trocar 'senha' por 's3nh@' adiciona uma fração de bit contra um atacante moderno, enquanto adicionar uma palavra aleatória adiciona mais de dez.
Devo forçar troca periódica de senha?
Não como regra fixa. A troca obrigatória a cada noventa dias leva as pessoas a criarem variações previsíveis do que já usavam. As orientações atuais recomendam trocar quando houver indício de comprometimento, e investir em senha longa, verificação contra listas de vazamento e segundo fator.
Frase-senha é melhor que senha aleatória?
Depende de como é montada. Quatro a seis palavras sorteadas de uma lista grande chegam a boa entropia e são muito mais fáceis de digitar e lembrar. Uma frase escolhida pela pessoa, ou tirada de música ou livro, tem entropia muito menor do que o comprimento sugere.

Ferramentas relacionadas

AL

Sobre o autor

Desenvolvedor de software no Brasil. Mantém o Codigio Labs desde a primeira ferramenta, escreve os artigos do site e revisa os textos quando a informação técnica muda.

Encontrou um erro ou tem uma correção a sugerir? Fale com o Codigio Labs. Correções relevantes são aplicadas com atualização da data de revisão do texto.

Continue lendo