Todos os artigos

Bcrypt: por que as senhas são hasheadas devagar, não rápido

Um jeito prático de entender o cost factor do bcrypt é olhar para os números: em um servidor comum, cost 10 leva algo como 60-70 ms para calcular um hash, cost 12 leva cerca de quatro vezes mais, e cost 14 chega perto de um segundo inteiro por tentativa. Um invasor tentando forçar uma senha offline sente esse mesmo multiplicador em cada tentativa — é por isso que ir de cost 10 para cost 12 não é um ajuste cosmético, é literalmente quadruplicar o custo de qualquer ataque de força bruta contra aquele hash.

Por que a velocidade prejudica a segurança das senhas

Se um atacante rouba um banco de hashes de senhas, ele tenta recuperar a senha original por força bruta. Com uma função rápida como SHA-256, hardware moderno testa bilhões de combinações por segundo. Com bcrypt configurado para levar dezenas ou centenas de milissegundos por hash, esse mesmo ataque se torna ordens de magnitude mais lento e caro.

O que é o cost factor

O parâmetro "cost" do bcrypt define o número de rodadas internas como uma potência de dois (2^cost, normalmente entre 10 e 12). Cada incremento de uma unidade dobra o tempo de processamento — e dobra igualmente o custo total de um ataque de força bruta, o que permite recalibrar o algoritmo à medida que o hardware fica mais rápido, sem trocar de esquema.

Salt embutido

O bcrypt gera automaticamente um salt aleatório único para cada senha e o embute diretamente no resultado — não há nada para guardar separadamente. Duas senhas idênticas produzem hashes diferentes, e tabelas pré-calculadas (rainbow tables) para senhas comuns se tornam inúteis: cada hash precisa ser atacado individualmente.

Para que serve

  • Armazenar corretamente as senhas dos usuários no banco de dados de uma aplicação.
  • Entender por que SHA-256 ou MD5 são uma má escolha para hashing de senhas.
  • Testar ou migrar um sistema de autenticação que usa bcrypt, ajustando o cost factor ao hardware disponível.

Um limite oculto: 72 bytes

O bcrypt processa apenas os primeiros 72 bytes de uma senha — o que exceder isso é descartado silenciosamente, sem aviso. Na prática isso raramente afeta senhas em português (72 caracteres ASCII já é uma senha enorme), mas vale conferir ao definir o limite máximo de um campo de senha, especialmente se a aplicação aceitar frases-senha longas com acentos.

Experimentar a ferramenta