Porque gerar um hash bcrypt online?
A autenticação HTTP Basic continua a ser a forma mais rápida de fechar um espaço de administração, uma pré-produção ou um painel interno. Baseia-se num ficheiro .htpasswd onde cada linha associa um identificador a uma palavra-passe com hash - nunca em 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 em Debian ou o httpd-tools em RHEL. Num computador Windows, num alojamento partilhado ou a partir de uma interface web, falta muitas vezes.
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 o indexar
- Adicionar uma conta sem acesso SSH → Criar a linha a partir do navegador e colá-la através do gestor de ficheiros do seu alojamento
- Modernizar um ficheiro existente → Substituir gradualmente as entradas
$apr1$por entradas$2y$
Como usar o gerador em 3 passos
Passo 1: introduzir o identificador e a palavra-passe
Indique o nome da conta e a sua palavra-passe. O campo fica oculto por predefinição; clique no olho para reler o que escreveu antes de validar. O botão "Gerar uma palavra-passe" extrai uma cadeia aleatória de 16 caracteres se 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 duplica o tempo de cálculo: na geração e em cada verificação feita pelo servidor.
Passo 3: copiar a linha
São apresentados dois resultados: o hash isolado e a linha .htpasswd completa. Copie esta última, cole-a no seu ficheiro e recarregue a configuração do servidor.
Anatomia de um hash bcrypt
Uma linha .htpasswd divide-se em dois campos separados por dois pontos:
admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
O segundo campo decompõe-se 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 rondas |
| 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: fica colado ao digest no último bloco. Continua legível em claro, o que é normal - o seu papel não é ser secreto, mas impedir que uma tabela pré-calculada sirva para recuperar a palavra-passe.
Compreender o fator de custo
O custo é um expoente, não um multiplicador. Um custo de N encadeia 2^N rondas de derivação de chave:
| Custo | Rondas | Tempo indicativo | Utilização |
|---|---|---|---|
| 8 | 256 | ~15 ms | Demasiado baixo hoje |
| 10 | 1 024 | ~60 ms | Predefinição do htpasswd -B, correto |
| 12 | 4 096 | ~250 ms | Recomendado para um acesso sensível |
| 14 | 16 384 | ~1 s | Latência percetível em cada ligação |
Duas coisas a ter em conta. Primeiro, esse tempo é pago em cada verificação, portanto em cada pedido HTTP Basic: um custo de 14 numa página cujo navegador repete a autenticação em cada recurso sente-se de imediato. Segundo, a definição correta depende do seu hardware: meça em vez de copiar um valor, com o objetivo habitual de 100 a 250 ms no servidor que fará a verificação.
Proteger um diretório com Apache
1. Criar o ficheiro
Coloque o seu ficheiro .htpasswd fora da raiz web, para que 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 ficheiros declara-se 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 suporte, o que cobre todas as distribuições Linux comuns.
bcrypt face aos outros formatos .htpasswd
| Formato | Prefixo | Custo de cálculo | Veredito |
|---|---|---|---|
| bcrypt | $2y$ | Ajustável, 2^custo rondas | Recomendado para qualquer projeto novo |
| APR1-MD5 | $apr1$ | 1 000 iterações 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, deixar de usar |
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 progresso das GPUs tornou irrisório. Mantenha o APR1-MD5 apenas se o seu servidor não souber ler $2y$.
Verificar o hash na linha de comandos
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 aMinhaPalavraPasse
# Impor um fator de custo de 12
htpasswd -nbB -C 12 admin aMinhaPalavraPasse
As duas cadeias não serão idênticas - o sal difere em cada extração -, mas ambas validam a mesma palavra-passe. Para o verificar:
# Repetir a verificação com o sal do hash existente
python3 -c "import bcrypt,sys; print(bcrypt.checkpw(b'aMinhaPalavraPasse', sys.argv[1].encode()))" '$2y$10$...'
FAQ - Perguntas frequentes
P: O que é o formato $2y$?
R: É o marcador de bcrypt num ficheiro .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 assinalar uma implementação corrigida de um bug nos caracteres não ASCII, bug ausente da biblioteca usada aqui. O Apache e o nginx aceitam os três.
P: Que fator de custo escolher?
R: 10 por predefinição, 12 para um acesso sensível. O reflexo certo é medir no servidor que fará a verificação e apontar para 100 a 250 ms: lento o suficiente para dificultar um ataque por dicionário, rápido o suficiente para não se notar no uso diário.
P: Porque é que não posso ultrapassar 15?
R: Como o custo é um expoente, 16 já exige vários segundos de cálculo e ultrapassaria o tempo atribuído a um pedido HTTP. Para um custo superior, gere o hash em local 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 às milhares de milhõ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 ficheiro .htpasswd, bcrypt sem hesitar.
P: Posso usar uma palavra-passe com mais de 72 caracteres?
R: Não, e não é um limite desta ferramenta: o bcrypt ignora pura e simplesmente tudo o que ultrapasse 72 bytes. Uma palavra-passe de 80 caracteres equivaleria, portanto, aos seus primeiros 72. Atenção: um caráter acentuado conta como dois bytes em UTF-8.
P: A palavra-passe é armazenada em algum lado?
R: Não. Viaja em HTTPS até à API CaptainDNS durante o cálculo e depois é esquecida. Nenhuma base de dados, nenhum registo com a palavra-passe em claro.
P: Onde deve ficar o ficheiro .htpasswd?
R: Fora da raiz web, por exemplo em /var/www/secrets/. Se estiver num diretório servido por HTTP, um visitante poderia descarregá-lo e atacar os hash offline - que é precisamente 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 palavras-passe | Extrair uma palavra-passe forte antes de a hashear |
| Hash Generator | Calcular MD5, SHA-1, SHA-256 e SHA-512 de um texto |
| Codificador Base64 | Codificar o cabeçalho Authorization de um pedido Basic |
| Analisador de cabeçalhos HTTP | Verificar os cabeçalhos devolvidos 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
A sua palavra-passe é enviada à API CaptainDNS apenas para calcular o hash, numa ligação encriptada. Não é armazenada nem registada. Apenas métricas técnicas anónimas são conservadas (tempo de processamento, código de resposta).