16

我正在尝试找到bcrypt可以在 Delphi 中使用的实现。谷歌搜索给我带来的唯一有用的东西是这个下载页面,其中包含一个名为bcrypt.h. 但是当我查看它提供的功能时,bcrypt.h似乎实际上并没有包含任何使用 Blowfish 算法来散列密码的方法!

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

这有点把我逼到了墙角。我认为找到一个实现会很容易,但似乎根本不是这样。有谁知道我在哪里可以得到一个?

4

1 回答 1

24

好的,所以我写了。

用法:

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 世纪初)常用的成本因素

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

还需要注意的是,哈希算法版本2a用于表示:

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

这就是为什么HashPasswordandCheckPassword函数采用WideString(aka UnicodeString),并在内部将它们转换为UTF-8 的原因。如果您在UnicodeString保留字的 Delphi 版本上运行它,则只需定义:

type
   UnicodeString = WideString;

我,正如大卫赫弗南所知,不拥有 Delphi XE 2。我添加了UnicodeString别名,但没有包含compilers.inc和定义UnicodeString(因为我不知道定义名称,也无法测试它)。你想从免费代码中得到什么?

该代码由两个单元组成:

  • Bcrypt.pas(我写的,带有嵌入式 DUnit 测试)
  • Blowfish.pas(由 Dave Barton 编写,我对其进行了改编、扩展、修复了一些错误并添加了 DUnit 测试)。

我可以在 intertubes 的哪个位置放置一些可以永久存在的代码?

2015 年 1 月 1 日更新:前段时间被放到 GitHub 上:BCrypt for Delphi

2015 年 4 月 16 日奖金:现在有适用于 Delphi 的 Scrypt

于 2012-05-04T02:08:23.950 回答