Ir para o conteúdo principal

Gerador de hash bcrypt

O formato .htpasswd recomendado, em 3 cliques

Quer adicionar uma conta a um ficheiro .htpasswd com o algoritmo recomendado, sem instalar o apache2-utils? Introduza um identificador e uma palavra-passe: a linha no formato $2y$ fica pronta a colar.

O custo é um expoente: cada passo duplica o tempo de cálculo. 10 é o valor do htpasswd -B e 12 um bom compromisso hoje em dia.

Principais funcionalidades da ferramenta

Formato $2y$ nativo

A hash bcrypt de htpasswd -B, derivada de Blowfish. Compatível com Apache 2.4, nginx, Traefik e Caddy.

Fator de custo ajustável

De 4 a 15, com cursor. Cada posição duplica o trabalho exigido a um atacante. 10 por predefinição, como htpasswd -B.

Linha pronta a colar

O resultado é apresentado como uma linha user:hash completa, copiável diretamente para o seu ficheiro .htpasswd.

Sal novo em cada chamada

O bcrypt integra um sal de 128 bits no hash. Duas contas com a mesma palavra-passe geram dois hash diferentes.

Nada é guardado

A palavra-passe serve para o cálculo e depois desaparece. Nenhum rasto na base de dados, nenhum registo com a palavra-passe em claro.

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:

ParteExemploFunção
Identificador de algoritmo2yIndica ao servidor que se trata de bcrypt
Fator de custo10Expoente: o cálculo encadeia 2^10 = 1 024 rondas
Sal + digestN9qo8uLOickgx2ZMRZoMye...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:

CustoRondasTempo indicativoUtilização
8256~15 msDemasiado baixo hoje
101 024~60 msPredefinição do htpasswd -B, correto
124 096~250 msRecomendado para um acesso sensível
1416 384~1 sLatê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

FormatoPrefixoCusto de cálculoVeredito
bcrypt$2y$Ajustável, 2^custo rondasRecomendado para qualquer projeto novo
APR1-MD5$apr1$1 000 iterações MD5Aceitável, compatibilidade máxima
SHA-1{SHA}1 iteração, sem salA evitar: sem sal, quebrável por tabela
crypt() DESnenhum25 iterações, truncado em 8 caracteresObsoleto, 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

FerramentaUtilidade
Gerador APR1-MD5Produzir uma linha .htpasswd no formato histórico do Apache
Gerador de palavras-passeExtrair uma palavra-passe forte antes de a hashear
Hash GeneratorCalcular MD5, SHA-1, SHA-256 e SHA-512 de um texto
Codificador Base64Codificar o cabeçalho Authorization de um pedido Basic
Analisador de cabeçalhos HTTPVerificar os cabeçalhos devolvidos por uma área protegida

Recursos úteis


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).