我正在尝试找到一个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)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用于表示:
这就是为什么HashPassword和CheckPassword函数采用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(因为我不知道定义名称,也不能测试它).你想从免费代码那里得到什么?
该代码包含两个单元:
在intertubes上我可以把一些代码放在永远存在的地方吗?
2015年1月1日更新:不久前它被放到了GitHub上:BCrypt for Delphi.
奖金4/16/2015:现在有德尔福的Scrypt