Proteja suas senhas com segurança utilizando o BCrypt no Delphi
Hoje em dia, dizer que uma senha deve ser criptografada, já não é nenhuma novidade, correto? A questão agora, é descobrir qual a melhor forma de cifrar tais informações, de forma que esta não venha ser descoberta por pessoas não autorizadas.
Na criptografia simétrica/assimétrica, sempre fazemos o uso de uma chave que serve tanto para encriptar, como também para descriptografar tais informações. Portanto, por meio desta chave é possível reverter a encriptação e obter as informações originais, o que torna este meio nada apropriado para a criptografia de senhas ou informações sigilosas.

Por que não {MD5, SHA1, SHA2, SHA3, etc}?
Todas essas funções de hash de uso geral, foram projetadas para calcular um resumo de grandes quantidades de dados no menor tempo possível. Isto significa que elas são fantásticas para garantir a integridade dos dados e totalmente inúteis para o armazenamento de senhas.
Um servidor moderno pode calcular um hash MD5 de cerca de 330 MB por segundo. Se seus usuários tiverem senhas minúsculas, alfanuméricas com no máximo 6 caracteres, é possível combinar todas as possíveis senhas em menos de um minuto.
Agora, se você estiver disposto a gastar cerca de 2.000 dólares, poderá montar seu próprio cluster de supercomputadores, que permitirá que você tente 700.000.000 de senhas por segundo.
Para resolver este problema, foi criado os algoritmos de hashing, onde uma vez que a informação é criptografada, não é mais possível reverter a situação. Para poder validar os dados, no caso de login, é só calcular o hash da senha fornecida pelo usuário e comparar com o hash salvo no banco de dados.
BCrypt
Com a constante evolução da tecnologia, é possível criar algoritmos eficientes com o intuito de quebrar hashes por força bruta, e foi por isso que surgiu em 1999, o BCrypt, desenvolvido por Niels Provos e David Mazières.
O BCrypt possui duas características importantes:
- Cost: refere-se ao custo do processamento, onde quanto maior o número fornecido, mais lento será o processamento para calcular o hash, porém, maior será o tempo para encontrar possíveis senhas no caso de ataque de força bruta.
- Salt: acrescenta aleatoriamente sequências de caracteres a senha, projetando resultados criptográficos complexos e aumentando a segurança contra ataques de força bruta, como o rainbow tables, ou seja, um hash sempre será diferente, mesmo que a senha seja igual.

Inserindo o BCrypt nos seus projetos Delphi
Instalando via Boss (gerenciador de dependências):
boss install https://github.com/viniciussanchez/bcrypt
Incluindo o módulo no projeto:
uses BCrypt;
Gerando um novo hash:
var
LHash: string;
begin
LHash := TBCrypt.GenerateHash('password');
end;
Comparando um hash (utilizado no login para verificar se a senha informada pelo usuário é a senha correta):
var
LVerify : Boolean;
begin
LVerify := TBCrypt.CompareHash('senha', 'hash');
end;
Exemplo de hash gerado:

Fontes: bcrypt, How To Safely Store A Password, Encriptando senhas com o Bcrypt e Uma breve introdução sobre BCrypt.
Código fonte: github.com