好了,所以我写的。
用法:
hash: string;
hash := TBCrypt.HashPassword('mypassword01');
回报是这样的:
$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm
这个(OpenBSD的)风格的密码哈希的有用的东西是:
- ,它识别算法(
2a
= bcrypt)
- the sal t会自动为您创建,并随附散列(
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
= 1024回合。这是此时常用的成本因素(早期21 st世纪)。
这也是有趣的是,因为没有已知的原因,OpenBSD的哈希密码转换成Base64的变种,是由其他人在这个星球上使用的Base64编码的不同。所以TBCrypt
包含一个自定义的base-64编码器和解码器。
这也是有用的注意,哈希算法版本2a
用来表示:
- bcrypt
- 包含密码的空终止的散列数据
- unicode字符串是UTF-8编码
所以这就是为什么HashPassword
和CheckPassword
功能需要WideString
(又名UnicodeString
),并在内部将它们转换为UTF-8。如果你在一个版本的Delphi,其中UnicodeString
是一个保留字运行这一点,那么简单地定义出来:
type
UnicodeString = WideString;
我,大卫·赫弗南知道,不要自己德尔福XE 2.我添加了UnicodeString
别名,但不包括compilers.inc
并定义为UnicodeString
(因为我不知道定义名称,我也不能测试它)。你想从免费代码中得到什么?
的代码包括两个单元:
哪里可以在intertubes上放一些代码,它可以永久生活吗?
更新1/1/2015:它被放在GitHub前一段时间:BCrypt for Delphi。
奖励2015年4月16日:现在有Scrypt for Delphi
你准备好考虑Vista中引入的Windows bcrypt吗? JEDI有一个头文件翻译:JwaBCrypt.pas – 2012-03-14 22:11:45
@David:这似乎是我在问题中提到的bcrypt.h winapi头文件的另一个翻译版,它实际上并未包含Blowfish密码哈希实现。 (或者我错过了什么?) – 2012-03-14 22:21:51
鲁迪的头是JEDI的起源之一,http://blog.delphi-jedi.net/2008/03/10/new-and-additional-header-files-from-rudy/ – 2012-03-14 22:33:00