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

Mas*_*ler 14 delphi bcrypt

我正在尝试找到一个bcrypt可以在Delphi中使用的实现.关于Googling给我带来的唯一有用的东西就是这个下载页面,其中包含一个叫做winapi单元的翻译标题bcrypt.h.但是,当我查看它提供的功能时,bcrypt.h似乎实际上没有任何方式使用Blowfish算法来散列密码!

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

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

Ian*_*oyd 20

好的,所以我写了.

用法:

hash: string;
hash := TBCrypt.HashPassword('mypassword01');
Run Code Online (Sandbox Code Playgroud)

返回类似于:

$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm 
Run Code Online (Sandbox Code Playgroud)

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

  • 它识别算法(2a= bcrypt)
  • salt会自动为您创建,并附带hash(Ro0CUfOqk6cXEKf3dyaM7O)
  • 所述成本因子参数也与散列进行(10).

检查密码是否正确:

isValidPassword: Boolean;
isValidPassword := TBCrypt.CheckPassword('mypassword1', hash);
Run Code Online (Sandbox Code Playgroud)

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

const
   BCRYPT_COST = 10; //cost determintes the number of rounds. 10 = 2^10 rounds (1024)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,成本10意味着密钥将被扩展和盐渍2 10= 1,024轮.这是在这个时间点(早21常用的成本因素ST世纪).

值得注意的是,由于没有任何已知的原因,OpenBSD散列密码被转换为Base-64变体,该变体与地球上其他所有人使用的Base64不同.因此TBCrypt包含一个自定义base-64编码器和解码器.

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

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

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

type
   UnicodeString = WideString;
Run Code Online (Sandbox Code Playgroud)

我,正如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

  • 永续年金?真的没有.但SourceForge,谷歌代码,GitHub或BitBucket是很好的候选人,应该有很长一段时间. (3认同)