好的,所以我写了。
用法:
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 编码的
这就是为什么HashPassword
andCheckPassword
函数采用WideString
(aka UnicodeString
),并在内部将它们转换为UTF-8 的原因。如果您在UnicodeString
保留字的 Delphi 版本上运行它,则只需定义:
type
UnicodeString = WideString;
我,正如大卫赫弗南所知,不拥有 Delphi XE 2。我添加了UnicodeString
别名,但没有包含compilers.inc
和定义UnicodeString
(因为我不知道定义名称,也无法测试它)。你想从免费代码中得到什么?
该代码由两个单元组成:
我可以在 intertubes 的哪个位置放置一些可以永久存在的代码?
2015 年 1 月 1 日更新:前段时间被放到 GitHub 上:BCrypt for Delphi。
2015 年 4 月 16 日奖金:现在有适用于 Delphi 的 Scrypt