我正在尝试找到一个可以在Delphi中使用的bcrypt
实现。关于谷歌搜索带给我的唯一有用的东西是this download page,其中包含名为bcrypt.h
的winapi单元的已翻译标题。但是当我查看它提供的功能时,bcrypt.h
似乎实际上没有任何方法可以使用Blowfish算法来散列密码!
我在C中找到了一些bcrypt实现,我可以从中构建DLL并链接到它们,除非它们似乎都需要* nix或者是GCC特定的,所以这也不起作用!
这有点让我感到困惑。我认为找到一个实现很容易,但事实上似乎并非如此。有谁知道我可以在哪里买到它?
答案 0 :(得分:20)
好的,所以我写了。
用法:
hash: string;
hash := TBCrypt.HashPassword('mypassword01');
返回类似的内容:
$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm
关于这个(OpenBSD)样式密码哈希的有用之处是:
2a
= bcrypt)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世纪早期 st 世纪)。
值得注意的是,由于众所周知的原因,OpenBSD散列密码被转换为Base-64变体,这与该星球上其他人使用的Base64不同。所以TBCrypt
包含一个自定义base-64编码器和解码器。
注意哈希算法版本2a
用于表示:
这就是为什么HashPassword
和CheckPassword
函数采用WideString
(又名UnicodeString
),并在内部将它们转换为 UTF-8 。如果你在Delphi版本上运行它,其中UnicodeString
是一个保留字,那么只需定义:
type
UnicodeString = WideString;
我,正如David Heffernan所知,不拥有Delphi XE 2.我添加了UnicodeString
别名,但没有包含compilers.inc
并定义了UnicodeString
(因为我不喜欢我不知道定义名称,也不能测试它。你想从免费代码那里得到什么?
该代码由两个单元组成:
在intertubes上我可以把一些代码放在永远存在的地方吗?
2015年1月1日更新:不久前它被放到了GitHub上:BCrypt for Delphi。
奖金4/16/2015 :现在有Scrypt for Delphi