Utilia

Gerador e verificador de bcrypt

Gera um hash bcrypt com fator de custo de 4 a 14, verifica uma palavra-passe com um hash existente e vê a versão, o custo, o salt e o resultado.

Gerar o hash de uma palavra-passe

Verificar uma palavra-passe com um hash

Como gerar o hash bcrypt de uma palavra-passe

  1. Em Gerar o hash de uma palavra-passe, escreve a Palavra-passe. Um contador mostra o comprimento em bytes UTF-8 e avisa-te quando passa dos 72 bytes.
  2. Escolhe o Fator de custo (4–14). A linha por baixo mostra o número de rondas, por exemplo 10 → 2^10 = 1024 rondas.
  3. Clica em Gerar hash. Uma barra de progresso acompanha o trabalho e a página continua utilizável enquanto o cálculo decorre. No fim, a ferramenta mostra o tempo gasto e o Hash bcrypt, pronto a copiar.
  4. O hash é decomposto nas suas partes: Versão, Custo, Salt (22 caracteres) e Hash (31 caracteres).

Para verificar uma palavra-passe com um hash, escreve a palavra-passe, cola o hash (o que acabaste de gerar é preenchido automaticamente) e clica em Verificar palavra-passe. O resultado diz se correspondem. Marca Ocultar palavras-passe para esconder os dois campos de palavra-passe.

O cálculo é feito no teu navegador com a biblioteca bcryptjs, carregada apenas quando precisas dela pela primeira vez. Nenhuma palavra-passe ou hash é enviado para lado nenhum.

Como funciona o bcrypt

O bcrypt (Provos e Mazières, 1999) é uma função de hash de palavras-passe baseada na cifra Blowfish. Ao contrário do SHA-256, é deliberadamente lento, e essa lentidão é ajustável: o fator de custo é uma potência de dois, por isso cada +1 duplica o trabalho. Um custo de 10 significa 1024 iterações da dispendiosa preparação da chave; um custo de 12 significa 4096. Essa lentidão quase não se nota quando um utilizador inicia sessão, mas torna muito mais cara a força bruta sobre uma base de dados roubada.

Um hash como $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy lê-se assim:

  • $2b$: a versão. $2a$ e $2y$ (PHP) são compatíveis e podem ser verificados aqui; $2x$ assinala hashes de uma implementação antiga com erros e é recusado.
  • 10: o fator de custo.
  • Os 22 caracteres seguintes: um salt aleatório de 128 bits, no alfabeto Base64 próprio do bcrypt (./A-Za-z0-9).
  • Os últimos 31 caracteres: o resultado de 184 bits.

Como o salt é aleatório e fica guardado no hash, calcular duas vezes o hash da mesma palavra-passe dá dois hashes diferentes, e ambos são verificados corretamente. É também por isso que se verifica uma palavra-passe com uma função de verificação, em vez de comparar hashes.

Escolher o custo

Escolhe o custo mais alto que o teu servidor aguente mantendo os inícios de sessão rápidos, tipicamente cerca de um quarto de segundo por hash. A OWASP recomenda um custo mínimo de 10 para o bcrypt. Os navegadores executam o bcrypt em JavaScript, várias vezes mais lento do que uma implementação nativa num servidor: a partir do custo 12, a ferramenta avisa que o cálculo pode demorar um a vários segundos, e cada passo a mais duplica o tempo. O trabalho é dividido em fatias curtas, para que a página não bloqueie.

Para sistemas novos, a OWASP prefere agora o Argon2id, continuando o bcrypt a ser aceitável onde o Argon2id não estiver disponível.

O limite de 72 bytes

O bcrypt só usa os primeiros 72 bytes da palavra-passe; tudo o que vem depois é ignorado sem aviso. Bytes não são caracteres: uma letra acentuada ocupa 2 bytes em UTF-8 e um emoji ocupa 4. Duas palavras-passe longas que partilhem os primeiros 72 bytes produzem o mesmo hash. O contador de bytes avisa-te quando uma palavra-passe é demasiado longa. Alguns sistemas fazem um pré-hash das palavras-passe longas (por exemplo com HMAC-SHA256 e depois Base64) antes do bcrypt; se o fizeres, nunca passes resultados binários em bruto, porque um byte zero terminaria a palavra-passe antes do tempo em muitas implementações.

Perguntas frequentes

Porque é que a mesma palavra-passe dá um hash diferente de cada vez?

Cada hash recebe um novo salt aleatório, que fica guardado dentro do hash. O botão Verificar palavra-passe lê o salt e o custo a partir do hash e volta a calculá-lo, por isso todas as versões são verificadas.

Um hash bcrypt pode ser desencriptado?

Não. O bcrypt é uma função de sentido único. A única forma de recuperar uma palavra-passe é adivinhá-la e calcular o hash de cada tentativa, e é exatamente isso que o fator de custo torna lento.

Que fator de custo devo usar?

Pelo menos 10, e mais se o teu servidor continuar rápido o suficiente. Mede no hardware de produção: o tempo mostrado aqui reflete o JavaScript no teu navegador, normalmente mais lento do que um servidor.

Os hashes $2a$, $2b$ e $2y$ são intermutáveis?

Para palavras-passe com menos de 256 bytes dão o mesmo resultado, e esta ferramenta verifica as três. O $2b$ corrigiu um erro de transbordo do comprimento na implementação do OpenBSD, e $2y$ é o nome dado no PHP a uma implementação correta.

É seguro escrever aqui uma palavra-passe verdadeira?

Tudo corre localmente e nada é enviado nem guardado. Ainda assim, para contas reais, é boa prática testar com uma palavra-passe de exemplo em vez de uma que uses.