Porquê gerar um hash APR1-MD5 em linha?
A autenticação HTTP Basic continua a ser a forma mais rápida de fechar uma área de administração, uma pré-produção ou um painel interno. Assenta num ficheiro .htpasswd em que cada linha associa um nome de utilizador a uma palavra-passe com hash, nunca em claro.
O senão: produzir esse hash exige normalmente o comando htpasswd, ou seja o pacote apache2-utils em Debian ou httpd-tools em RHEL. Num posto Windows, num alojamento partilhado ou a partir de uma interface web, esse comando falta muitas vezes.
Três situações em que este gerador resolve o problema:
- Proteger uma pré-produção → Fechar o acesso a um ambiente de testes antes de o Google o indexar
- Acrescentar uma conta sem acesso SSH → Criar a linha no navegador e colá-la através do gestor de ficheiros do alojamento
- Migrar uma configuração → Reconstruir um ficheiro
.htpasswdperdido a partir das credenciais conhecidas
Como usar o gerador em 3 passos
Passo 1: introduzir o utilizador e a palavra-passe
Escreva o nome da conta e a respetiva palavra-passe. O campo está oculto por omissão; carregue no ícone do olho para reler o que escreveu antes de validar.
Passo 2: deixar o sal ser gerado
Na quase totalidade dos casos, deixe o campo do sal vazio: será sorteado do lado do servidor um sal aleatório de 8 caracteres. Preencha-o apenas para reproduzir um hash existente de forma idêntica.
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 uma linha .htpasswd
Uma linha divide-se em dois campos separados por dois pontos:
admin:$apr1$Xq7nD2mR$5CqLZ.k1qLkOvVQ0uZ9Yl.
O segundo campo decompõe-se, por sua vez, em três partes delimitadas por $:
| Parte | Exemplo | Função |
|---|---|---|
| Identificador do algoritmo | apr1 | Indica ao servidor que se trata do MD5 com sal do Apache |
| Sal | Xq7nD2mR | 8 caracteres aleatórios, guardados em claro no ficheiro |
| Resumo | 5CqLZ.k1qLkOvVQ0uZ9Yl. | 22 caracteres, resultado das 1.000 iterações |
O sal não é um segredo: está legível no ficheiro. A sua função é impedir que uma tabela pré-calculada (rainbow table) sirva para recuperar a palavra-passe e garantir que duas contas com a mesma palavra-passe não tenham o mesmo resumo.
O que faz realmente o algoritmo $apr1$
O APR1-MD5 não é um simples md5(palavra-passe + sal). Encadeia:
- Dois resumos iniciais - um sobre
palavra-passe + $apr1$ + sal, outro sobrepalavra-passe + sal + palavra-passe - Uma mistura dependente do comprimento - fragmentos do segundo resumo são reinjetados no primeiro, byte a byte
- 1.000 iterações - em cada volta, palavra-passe, sal e resumo anterior são recombinados segundo um padrão que depende do número da volta
- Uma codificação base64 «crypt» - os 16 bytes finais são relidos numa ordem entrelaçada e codificados no alfabeto
./0-9A-Za-z
São estas 1.000 iterações que fazem a diferença face a um MD5 simples: multiplicam por mil o custo de cada tentativa, travando na mesma medida um ataque por dicionário.
Proteger um diretório com o 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 "Area reservada"
AuthUserFile /var/www/secrets/.htpasswd
Require valid-user
3. Recarregar a configuração
sudo apachectl configtest && sudo systemctl reload apache2
No nginx, o mesmo par de ficheiros declara-se assim:
location /admin/ {
auth_basic "Area reservada";
auth_basic_user_file /var/www/secrets/.htpasswd;
}
APR1-MD5 face aos outros formatos .htpasswd
| Formato | Prefixo | Custo de cálculo | Veredicto |
|---|---|---|---|
| bcrypt | $2y$ | Ajustável (fator de custo) | 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 aos 8 caracteres | Obsoleto, não usar |
Em resumo: se o seu servidor aceitar bcrypt (htpasswd -B), use-o. O APR1-MD5 é a melhor opção restante quando o bcrypt não está disponível - e vale infinitamente mais do que um {SHA} sem sal.
Verificar o hash na linha de comandos
Com o mesmo sal, o resultado desta ferramenta é idêntico ao dos utilitários do sistema:
# Com htpasswd (pacote apache2-utils / httpd-tools)
htpasswd -nbm admin minhaPalavraPasse
# Com OpenSSL, impondo o sal
openssl passwd -apr1 -salt Xq7nD2mR minhaPalavraPasse
O segundo exemplo serve também para controlar esta ferramenta: introduza o mesmo sal no formulário e deve obter exatamente a mesma cadeia.
Para verificar se uma palavra-passe corresponde a uma linha existente, releia o sal contido no hash guardado e repita o cálculo com esse sal.
FAQ - Perguntas frequentes
P: O que é o formato $apr1$?
R: É o formato de hash histórico do Apache, também chamado APR1-MD5. Aplica 1.000 iterações de MD5 sobre a palavra-passe e um sal de 8 caracteres, e codifica o resultado no alfabeto base64 do crypt. O prefixo $apr1$ funciona como identificador do algoritmo.
P: O APR1-MD5 ainda é seguro?
R: É bastante mais sólido do que um MD5 simples, mas continua rápido de calcular para um atacante com GPU. Para um projeto novo, prefira bcrypt através de htpasswd -B. O APR1-MD5 mantém o seu interesse quando a compatibilidade prevalece: versões antigas do Apache, nginx sem suporte de bcrypt, equipamentos de rede.
P: Este hash funciona com o nginx?
R: Sim. O módulo ngx_http_auth_basic_module do nginx lê o formato Apache, $apr1$ incluído. A linha gerada usa-se tal como está com auth_basic_user_file.
P: Porque obtenho um hash diferente de cada vez?
R: Em cada geração é sorteado um novo sal aleatório. Os dois hashes são válidos para a mesma palavra-passe: na verificação, o servidor relê o sal guardado no hash e refaz o cálculo. Preencha o campo do sal se quiser um resultado reproduzível.
P: A palavra-passe fica guardada em algum lado?
R: Não. Circula em HTTPS até à API CaptainDNS durante o cálculo e depois é descartada. Nem base de dados, nem registo com a palavra-passe em claro.
P: Posso usar acentos ou símbolos?
R: Sim, o cálculo incide sobre os bytes UTF-8 da palavra-passe. Uma ressalva: um cliente HTTP antigo pode codificar os caracteres não ASCII de outra forma, o que faria falhar a autenticação. Na dúvida, fique-se pelo ASCII.
P: Onde colocar 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 hashes offline.
Ferramentas complementares
| Ferramenta | Utilidade |
|---|---|
| Gerador de palavras-passe | Sortear uma palavra-passe sólida antes de lhe aplicar o hash |
| Gerador de hash | 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 |
| Teste HSTS | Garantir que o acesso protegido passa mesmo por HTTPS |
Recursos úteis
- Documentação Apache - htpasswd (opções do comando e formatos suportados)
- Documentação Apache - Autenticação (implementação da autenticação Basic)
- RFC 7617 - The Basic HTTP Authentication Scheme (especificação do esquema Basic)
- RFC 1321 - MD5 (especificação da função MD5)
Compromisso de confidencialidade
A sua palavra-passe é transmitida à API CaptainDNS unicamente para calcular o hash, numa ligação cifrada. Não é guardada nem registada. Só ficam métricas técnicas anónimas (duração do processamento, código de resposta).