是否有可用于Delphi的bcrypt实现?

时间:2012-03-14 21:01:46

标签: delphi bcrypt

我正在尝试找到一个可以在Delphi中使用的bcrypt实现。关于谷歌搜索带给我的唯一有用的东西是this download page,其中包含名为bcrypt.h的winapi单元的已翻译标题。但是当我查看它提供的功能时,bcrypt.h似乎实际上没有任何方法可以使用Blowfish算法来散列密码!

我在C中找到了一些bcrypt实现,我可以从中构建DLL并链接到它们,除非它们似乎都需要* nix或者是GCC特定的,所以这也不起作用!

这有点让我感到困惑。我认为找到一个实现很容易,但事实上似乎并非如此。有谁知道我可以在哪里买到它?

1 个答案:

答案 0 :(得分:20)

好的,所以我写了。

用法:

hash: string;
hash := TBCrypt.HashPassword('mypassword01');

返回类似的内容:

$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm 

关于这个(OpenBSD)样式密码哈希的有用之处是:

  • 它标识算法(2a = bcrypt)
  • 会自动为您创建salt,并附带散列(Ro0CUfOqk6cXEKf3dyaM7O
  • 成本因素参数也随哈希值(10)一起提供。

检查密码是否正确:

isValidPassword: Boolean;
isValidPassword := TBCrypt.CheckPassword('mypassword1', hash);

BCrypt使用成本因子,该因子决定了密钥设置的迭代次数。成本越高,计算哈希的成本就越高。常量BCRYPT_COST包含默认成本:

const
   BCRYPT_COST = 10; //cost determintes the number of rounds. 10 = 2^10 rounds (1024)

在这种情况下,10的费用意味着该密钥将被扩展并加盐2 10 = 1,024轮。这是此时常用的成本因素(21世纪早期 st 世纪)。

值得注意的是,由于众所周知的原因,OpenBSD散列密码被转换为Base-64变体,这与该星球上其他人使用的Base64不同。所以TBCrypt包含一个自定义base-64编码器和解码器。

注意哈希算法版本2a用于表示:

也很有用
  • bcrypt
  • 在散列数据中包含密码的空终止符
  • unicode字符串是UTF-8编码的

这就是为什么HashPasswordCheckPassword函数采用WideString(又名UnicodeString),并在内部将它们转换为 UTF-8 。如果你在Delphi版本上运行它,其中UnicodeString是一个保留字,那么只需定义:

type
   UnicodeString = WideString;

我,正如David Heffernan所知,不拥有Delphi XE 2.我添加了UnicodeString别名,但没有包含compilers.inc并定义了UnicodeString(因为我不喜欢我不知道定义名称,也不能测试它。你想从免费代码那里得到什么?

该代码由两个单元组成:

  • Bcrypt.pas(我用嵌入式DUnit测试写的)
  • Blowfish.pas(Dave Barton写道,我改编,扩展,修复了一些错误并添加了DUnit测试)。

在intertubes上我可以把一些代码放在永远存在的地方吗?

2015年1月1日更新:不久前它被放到了GitHub上:BCrypt for Delphi

奖金4/16/2015 :现在有Scrypt for Delphi