Gerador de Senha: entropia, não comprimento, é o que protege
A força de uma senha aleatória é uma função direta de entropia
— quantos bits de incerteza ela carrega — e não do comprimento por si
só. Entropia se calcula como log₂(tamanho_do_alfabeto ^ comprimento),
ou de forma equivalente, comprimento × log₂(tamanho_do_alfabeto).
Uma senha de 8 caracteres usando só dígitos (alfabeto de 10 símbolos)
tem cerca de 26,6 bits de entropia; a mesma senha de 8 caracteres
usando maiúsculas, minúsculas, números e símbolos (alfabeto de ~72
símbolos) tem cerca de 49 bits — quase o dobro de incerteza, mesmo
número de caracteres. É por isso que o guia atual do NIST (SP 800-63B)
recomenda priorizar comprimento sobre complexidade forçada: uma senha
de 16 caracteres só minúsculas já supera em entropia uma de 8
caracteres com todos os tipos de símbolo obrigatórios.
Por que este gerador garante ao menos 1 caractere de cada conjunto marcado
Sortear cada caractere de forma totalmente independente do alfabeto
combinado poderia, por azar estatístico, produzir uma senha sem nenhum
símbolo especial mesmo com a opção marcada — improvável, mas possível.
Este gerador evita isso garantindo pelo menos um caractere de cada
conjunto selecionado antes de preencher o resto aleatoriamente, e só
então embaralha o resultado (Fisher-Yates, via shuffle() do
PHP) para que a posição de cada tipo de caractere não seja previsível —
sem essa etapa final de embaralhamento, os caracteres garantidos
ficariam sempre nas primeiras posições, o que é um padrão detectável e
reduz a entropia efetiva da senha.
Uso em testes automatizados e fixtures
Suítes de teste que exercitam cadastro de usuário, troca de senha ou
políticas de complexidade (senha fraca rejeitada, senha forte aceita)
precisam gerar senhas sob demanda que satisfaçam critérios específicos
— só minúsculas e números para testar rejeição de política, ou com
todos os tipos de caractere para testar aceitação. Gerar via API,
parametrizando os conjuntos de caracteres, evita hardcoded strings como
"Teste123!" repetidas em centenas de testes — que além de
não exercitarem a aleatoriedade real do sistema, viram um padrão
reconhecível caso apareçam por engano em algum ambiente não isolado.