O que é bcrypt?
O bcrypt é uma função de hashing de senhas baseada na cifra de bloco Blowfish que incorpora um salt integrado e um fator de custo configurável, projetada para ser computacionalmente custosa de um modo que resiste especificamente à aceleração por GPU e hardware especializado.
Também conhecido como: bcrypt hash, Blowfish crypt
O bcrypt foi projetado em 1999 por Niels Provos e David Mazieres especificamente para o hashing de senhas, numa época em que a maioria dos sistemas usava funções de hash rápidas como MD5 ou SHA-1. Sua principal inovação foi o fator de custo: um parâmetro que controla quantas iterações da configuração de chave Blowfish subjacente são realizadas. Cada incremento do fator de custo dobra o tempo de cálculo, permitindo aos defensores escalar a dificuldade à medida que o hardware fica mais rápido.
O que distingue o bcrypt do PBKDF2 é sua resistência à aceleração por GPU. O PBKDF2 usa operações HMAC que se ajustam bem às arquiteturas de GPU, permitindo aos atacantes com GPUs de consumo alcançar um paralelismo massivo. A programação de chaves do bcrypt, baseada em Blowfish, exige acesso frequente a uma tabela de estado de 4 KB que precisa ser modificada durante o cálculo. Esse padrão de acesso à memória não se paraleliza de forma eficiente nas GPUs, obrigando os atacantes a recorrer a ataques na velocidade da CPU.
O bcrypt produz uma string de 60 caracteres que codifica em conjunto a versão do algoritmo, o fator de custo, o salt e o hash, o que a torna autocontida e portável. Um hash típico de bcrypt tem a aparência $2b$12$..., onde 12 é o fator de custo. O fator de custo mínimo recomendado atualmente é 10 (aproximadamente 100 ms por hash em hardware moderno), embora 12-14 seja comum em aplicações que podem tolerar tempos de login um pouco mais lentos. O bcrypt está disponível em praticamente todas as linguagens de programação e continua sendo um dos algoritmos de hashing de senhas mais implantados.
Como o Vaulted usa bcrypt
O Vaulted usa PBKDF2 em vez de bcrypt para a derivação de chave baseada em frase-senha, porque o PBKDF2 está disponível de forma nativa por meio da Web Crypto API nos navegadores, enquanto o bcrypt não. A Web Crypto API não expõe o bcrypt, então usá-lo exigiria uma implementação em JavaScript que sacrifica os benefícios de segurança da execução nativa e em tempo constante. Para aplicações do lado do servidor que fazem hashing de senhas para autenticação, o bcrypt continua sendo uma excelente opção, mas para a derivação de chave no lado do cliente no navegador, o PBKDF2 por meio da Web Crypto é a abordagem padrão.