Um hash bcrypt não pode ser "descriptografado": para saber se uma senha é a correta, use o modo Verificar. Tudo é calculado no seu navegador e a senha não é enviada a nenhum servidor.
Versão atual. É gerada pelo OpenBSD, Node.js, Python, Go e Rust.
Cada ponto de custo dobra o tempo de cálculo. A OWASP recomenda no mínimo 10; o ideal é o valor mais alto que o seu servidor consiga calcular em cerca de 250 ms.
Como funciona
O bcrypt é uma função de hash criada para armazenar senhas. Diferentemente do SHA-256 ou do MD5, que são calculados em microssegundos, o bcrypt é lento de propósito: assim, quem roubar um banco de dados leva anos para testar senhas por força bruta.
Cada hash guarda tudo o que é necessário para verificá-lo: a versão do algoritmo, o custo e um salt aleatório de 128 bits. Por isso a mesma senha gera um hash diferente a cada vez e não é preciso armazenar o salt separadamente.
O custo é o logaritmo na base 2 da quantidade de rodadas: com custo 10 são calculadas 1024 rodadas e com custo 12, 4096. Aumentar um ponto dobra o tempo de cálculo, o que permite acompanhar o aumento da potência do hardware sem trocar de algoritmo.
Exemplos
rasmuslerdorf$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1aO exemplo de password_verify() do manual do PHP: cole-o no modo Verificar com essa senha e ele coincide.abc$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0iUm vetor de teste do jBCrypt com custo 6. Os primeiros 22 caracteres depois do custo são o salt; os 31 restantes, o resultado.Casos de uso
- Criar o hash da senha inicial de um usuário administrador para inseri-lo diretamente no banco de dados.
- Verificar se uma senha corresponde ao hash armazenado quando um usuário não consegue fazer login.
- Gerar hashes de teste para fixtures, seeds ou testes automatizados de uma aplicação Laravel, Spring, Django ou Node.js.
- Medir quanto tempo cada custo leva para escolher o valor adequado antes de configurá-lo no servidor.
- Criar entradas para arquivos .htpasswd do Apache, que aceitam hashes bcrypt com o prefixo $2y$.
Perguntas frequentes
É possível descriptografar um hash bcrypt?
Não. O bcrypt é uma função de mão única: não há como obter a senha a partir do hash. A única possibilidade é testar senhas candidatas e ver se alguma coincide, que é justamente o que o bcrypt torna lento.
Qual é a diferença entre $2a$, $2b$ e $2y$?
As três calculam a mesma coisa para senhas normais. $2a$ é a versão original; $2y$ foi introduzida pelo PHP em 2011 para distinguir seus hashes dos de uma implementação com um bug; $2b$ foi adotada pelo OpenBSD em 2014 ao corrigir outro bug com senhas de mais de 255 caracteres. Quase todas as bibliotecas aceitam as três ao verificar.
Qual custo convém usar?
A OWASP recomenda no mínimo 10. O ideal é o valor mais alto que o seu servidor consiga calcular em cerca de 250 ms por login. O Spring Security usa 10 por padrão; o Laravel 11 e o PHP 8.4 aumentaram o deles para 12.
Por que o bcrypt ignora o que passa de 72 bytes?
O algoritmo usa a senha como chave do Blowfish, que aceita até 72 bytes. O que sobra é descartado sem aviso, de modo que duas senhas que compartilham os primeiros 72 bytes geram o mesmo hash. Caracteres acentuados ou emojis ocupam de dois a quatro bytes; por isso a ferramenta conta bytes e não caracteres.
O que é melhor, bcrypt ou Argon2?
O Argon2id é o algoritmo recomendado hoje para sistemas novos porque, além de lento, usa muita memória, o que encarece os ataques com GPU. Ainda assim, o bcrypt continua seguro com um custo adequado e é o padrão no PHP, Laravel, Spring e Ruby on Rails.
Minha senha é enviada a algum servidor?
Não. O hash e a verificação são calculados no seu navegador e a senha nunca sai do seu dispositivo; ela também não é incluída no link para compartilhar a ferramenta.