Por que gerar um hash bcrypt online?
A autenticação HTTP Basic continua sendo a forma mais rápida de fechar uma área de administração, uma pré-produção ou um painel interno. Ela se apoia em um arquivo .htpasswd onde cada linha associa um identificador a uma senha com hash - nunca em texto claro.
Desde o Apache 2.4, o comando htpasswd -B produz bcrypt, e é o formato recomendado pela documentação oficial. O problema: esse comando pressupõe ter instalado o apache2-utils no Debian ou o httpd-tools no RHEL. Em um computador Windows, em uma hospedagem compartilhada ou a partir de uma interface web, ele costuma faltar.
Três situações em que este gerador resolve:
- Proteger uma pré-produção → Fechar o acesso a um ambiente de teste antes de o Google indexá-lo
- Adicionar uma conta sem acesso SSH → Criar a linha no navegador e colá-la pelo gerenciador de arquivos da sua hospedagem
- Modernizar um arquivo existente → Substituir gradualmente as entradas
$apr1$por entradas$2y$
Como usar o gerador em 3 passos
Passo 1: digitar o identificador e a senha
Informe o nome da conta e a senha. O campo fica oculto por padrão; clique no olho para reler o que digitou antes de validar. O botão "Gerar uma senha" sorteia uma sequência aleatória de 16 caracteres se você ainda não tiver uma.
Passo 2: ajustar o fator de custo
O cursor parte de 10, o valor do htpasswd -B. Suba para 12 para um acesso sensível. Cada posição dobra o tempo de cálculo: na geração e em cada verificação feita pelo servidor.
Passo 3: copiar a linha
Dois resultados são exibidos: o hash isolado e a linha .htpasswd completa. Copie esta última, cole no seu arquivo e recarregue a configuração do servidor.
Anatomia de um hash bcrypt
Uma linha .htpasswd se divide em dois campos separados por dois-pontos:
admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
O segundo campo se decompõe assim:
| Parte | Exemplo | Função |
|---|---|---|
| Identificador de algoritmo | 2y | Indica ao servidor que se trata de bcrypt |
| Fator de custo | 10 | Expoente: o cálculo encadeia 2^10 = 1.024 rodadas |
| Sal + digest | N9qo8uLOickgx2ZMRZoMye... | 53 caracteres: 22 para o sal de 128 bits, 31 para a impressão digital |
Ao contrário do APR1-MD5, o sal não ocupa um campo separado: ele fica colado ao digest no último bloco. Ele continua legível em texto claro, o que é normal - seu papel não é ser secreto, mas impedir que uma tabela pré-calculada sirva para recuperar a senha.
Entendendo o fator de custo
O custo é um expoente, não um multiplicador. Um custo de N encadeia 2^N rodadas de derivação de chave:
| Custo | Rodadas | Tempo indicativo | Uso |
|---|---|---|---|
| 8 | 256 | ~15 ms | Baixo demais hoje |
| 10 | 1.024 | ~60 ms | Padrão do htpasswd -B, correto |
| 12 | 4.096 | ~250 ms | Recomendado para um acesso sensível |
| 14 | 16.384 | ~1 s | Latência perceptível em cada conexão |
Duas coisas para ter em mente. Primeiro, esse tempo é pago a cada verificação, portanto a cada requisição HTTP Basic: um custo de 14 em uma página cujo navegador repete a autenticação a cada recurso é sentido na hora. Segundo, o ajuste correto depende do seu hardware: meça em vez de copiar um valor, com o alvo habitual de 100 a 250 ms no servidor que fará a verificação.
Protegendo um diretório com Apache
1. Criar o arquivo
Coloque seu arquivo .htpasswd fora da raiz web, para que ele nunca seja servido por HTTP:
/var/www/secrets/.htpasswd
2. Declarar a proteção
No .htaccess do diretório a proteger, ou no bloco <Directory> do seu VirtualHost:
AuthType Basic
AuthName "Zona restrita"
AuthUserFile /var/www/secrets/.htpasswd
Require valid-user
3. Recarregar a configuração
sudo apachectl configtest && sudo systemctl reload apache2
Para o nginx, o mesmo par de arquivos se declara assim:
location /admin/ {
auth_basic "Zona restrita";
auth_basic_user_file /var/www/secrets/.htpasswd;
}
O nginx lê bcrypt desde a versão 1.0.3 em sistemas cuja crypt_r() o suporta, o que cobre todas as distribuições Linux comuns.
bcrypt frente aos outros formatos .htpasswd
| Formato | Prefixo | Custo de cálculo | Veredito |
|---|---|---|---|
| bcrypt | $2y$ | Ajustável, 2^custo rodadas | Recomendado para qualquer projeto novo |
| APR1-MD5 | $apr1$ | 1.000 iterações de MD5 | Aceitável, compatibilidade máxima |
| SHA-1 | {SHA} | 1 iteração, sem sal | A evitar: sem sal, quebrável por tabela |
| crypt() DES | nenhum | 25 iterações, truncado em 8 caracteres | Obsoleto, não usar mais |
Em resumo: o bcrypt é o único formato .htpasswd cujo custo se ajusta ao hardware da época. Os outros três têm um custo fixo, decidido nos anos 1990 ou 2000, que o avanço das GPUs tornou irrisório. Mantenha o APR1-MD5 apenas se o seu servidor não souber ler $2y$.
Verificando o hash pela linha de comando
O resultado desta ferramenta é um hash bcrypt padrão, verificável com os utilitários do sistema:
# Gerar o equivalente com htpasswd (pacote apache2-utils / httpd-tools)
htpasswd -nbB admin minhaSenha
# Impor um fator de custo de 12
htpasswd -nbB -C 12 admin minhaSenha
As duas sequências não serão idênticas - o sal muda a cada sorteio -, mas ambas validam a mesma senha. Para conferir:
# Repetir a verificação com o sal do hash existente
python3 -c "import bcrypt,sys; print(bcrypt.checkpw(b'minhaSenha', sys.argv[1].encode()))" '$2y$10$...'
FAQ - Perguntas frequentes
P: O que é o formato $2y$?
R: É o marcador de bcrypt em um arquivo .htpasswd. O hash completo segue o padrão $2y$<custo>$<sal><digest>: um identificador de algoritmo, um fator de custo de dois dígitos e 53 caracteres com o sal de 128 bits e a impressão digital. É o que o htpasswd -B escreve.
P: Qual a diferença entre $2a$, $2b$ e $2y$?
R: Nenhuma de fundo: são três marcadores do mesmo algoritmo. O $2y$ foi introduzido pelo PHP em 2011 para sinalizar uma implementação corrigida de um bug com caracteres não ASCII, bug ausente da biblioteca usada aqui. Apache e nginx aceitam os três.
P: Qual fator de custo escolher?
R: 10 por padrão, 12 para um acesso sensível. O reflexo certo é medir no servidor que fará a verificação e mirar 100 a 250 ms: lento o bastante para atrapalhar um ataque de dicionário, rápido o bastante para não incomodar no uso diário.
P: Por que não posso passar de 15?
R: Como o custo é um expoente, 16 já exige vários segundos de cálculo e ultrapassaria o tempo concedido a uma requisição HTTP. Para um custo maior, gere o hash localmente com htpasswd -B -C 18.
P: O bcrypt é melhor que o APR1-MD5?
R: Sim, claramente. O APR1-MD5 encadeia 1.000 iterações de MD5, que o hardware especializado calcula aos bilhões por segundo. O bcrypt exige memória e acessos não sequenciais, o que limita fortemente o paralelismo de uma GPU. Para um novo arquivo .htpasswd, bcrypt sem hesitar.
P: Posso usar uma senha com mais de 72 caracteres?
R: Não, e não é um limite desta ferramenta: o bcrypt ignora pura e simplesmente tudo o que ultrapassar 72 bytes. Uma senha de 80 caracteres equivaleria, portanto, aos seus primeiros 72. Atenção: um caractere acentuado conta como dois bytes em UTF-8.
P: A senha é armazenada em algum lugar?
R: Não. Ela trafega em HTTPS até a API da CaptainDNS durante o cálculo e depois é esquecida. Nenhum banco de dados, nenhum registro com a senha em texto claro.
P: Onde o arquivo .htpasswd deve ficar?
R: Fora da raiz web, por exemplo em /var/www/secrets/. Se estiver em um diretório servido por HTTP, um visitante poderia baixá-lo e atacar os hashes offline - que é exatamente o que o fator de custo torna caro, embora não impossível.
Ferramentas complementares
| Ferramenta | Utilidade |
|---|---|
| Gerador APR1-MD5 | Produzir uma linha .htpasswd no formato histórico do Apache |
| Gerador de senhas | Sortear uma senha forte antes de aplicar o hash |
| Hash Generator | Calcular MD5, SHA-1, SHA-256 e SHA-512 de um texto |
| Codificador Base64 | Codificar o cabeçalho Authorization de uma requisição Basic |
| Analisador de cabeçalhos HTTP | Conferir os cabeçalhos retornados por uma área protegida |
Recursos úteis
- Documentação do Apache - htpasswd (opções do comando, incluindo -B e -C)
- Documentação do Apache - Autenticação (configuração da autenticação Basic)
- A Future-Adaptable Password Scheme (artigo fundador do bcrypt, Provos e Mazieres, 1999)
- RFC 7617 - The Basic HTTP Authentication Scheme (especificação do esquema Basic)
Compromisso de privacidade
Sua senha é enviada à API da CaptainDNS apenas para calcular o hash, em uma conexão criptografada. Ela não é armazenada nem registrada. Apenas métricas técnicas anônimas são conservadas (tempo de processamento, código de resposta).