Delphi有可用的bcrypt实现吗?

17

我正在尝试找到一个Delphi可以使用的bcrypt实现。在谷歌搜索中,关于唯一有用的是这个下载页面,其中包含了一个名为bcrypt.h的winapi单元的翻译头文件。但是当我查看它提供的功能时,bcrypt.h似乎并不包含任何使用Blowfish算法来哈希密码的方式!

我找到了一些C语言的bcrypt实现,可以从中构建DLL并链接,但它们似乎都需要*nix或特定于GCC,因此也行不通!

这真的让我很恼火。我原以为会很容易找到实现,但事实并非如此。有人知道哪里可以获取一个吗?


2
你准备好考虑在Vista中引入的Windows bcrypt了吗?JEDI有一个头文件翻译:JwaBCrypt.pas。 - David Heffernan
@David:这似乎是我在问题中提到的bcrypt.h winapi头文件的另一个翻译,但它似乎并不包含Blowfish密码哈希实现。(或者我错过了什么?) - Mason Wheeler
Rudy的头文件是JEDI头文件的起源,来源于http://blog.delphi-jedi.net/2008/03/10/new-and-additional-header-files-from-rudy/。 - LU RD
有很多使用Delphi实现Blowfish算法的库:http://www.torry.net/pages.php?id=519 - Torbins
1
@rob,这个DLL是Windows系统的DLL。 - David Heffernan
显示剩余2条评论
1个回答

24

好的,我写完了。

使用方法:

hash: string;
hash := TBCrypt.HashPassword('mypassword01');

返回类似于以下内容:

$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm 

这种(OpenBSD)风格的密码哈希的有用之处在于:

  • 它标识了算法(2a = bcrypt)。
  • 盐值会自动为您创建,并随着哈希值一起提供(Ro0CUfOqk6cXEKf3dyaM7O)。
  • 成本因素参数也会随哈希值传递(10)。

要检查密码是否正确:

isValidPassword: Boolean;
isValidPassword := TBCrypt.CheckPassword('mypassword1', hash);

BCrypt使用一个cost因子,确定密钥设置将经过多少次迭代。成本越高,计算哈希值的成本就越高。常量BCRYPT_COST包含默认成本:

const
   BCRYPT_COST = 10; //cost determintes the number of rounds. 10 = 2^10 rounds (1024)
在这种情况下,成本为10表示该密钥将被扩展和盐化210= 1,024轮。这是目前通常使用的成本因子(21世纪初)。
有趣的是,OpenBSD哈希密码被转换为一种不同于地球上其他人使用的Base-64变体。因此,TBCrypt包含自定义的base-64编码器和解码器。
值得注意的是,哈希算法版本2a用于表示:
- bcrypt - 包括密码的空终止符在内的散列数据 - Unicode字符串采用UTF-8编码
因此,HashPasswordCheckPassword函数接受WideString(也称为UnicodeString),并在内部将其转换为UTF-8。如果您在运行此代码的Delphi版本中UnicodeString是保留字,则可以简单地定义输出:
type
   UnicodeString = WideString;

我,就像David Heffernan所知道的那样,并没有拥有Delphi XE 2。我添加了UnicodeString别名,但没有包含compilers.inc并且没有定义UnicodeString(因为我不知道定义名称,也无法进行测试)。你想要从免费代码得到什么?

代码由两个单元组成:

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

在互联网上,哪里可以放置一些代码,使其永久存在?

更新 2015年1月1日: 它已经在GitHub上发布了一段时间:BCrypt for Delphi

奖励 2015年4月16日:现在有Scrypt for Delphi


3
永久性?实际上没有特定的地方。但SourceForge、Google Code、GitHub或BitBucket是很好的选择,它们应该会存在很长一段时间。 - afrazier
目前,答案中的文件名(bcrypt.pasblowfish.pas)链接到 Pastebin 网站。 - Ian Boyd
真的应该把这个放到 Bitbucket 上! - Warren P
1
@WarrenP 现在我记得为什么我没有使用BitBucket了。为了上传代码,我必须注册并下载他们的源代码控制客户端?这只是两个文件! - Ian Boyd
你可以fork那个项目,如果你创建了一个Bitbucket账户,或者你可以把你的电子邮件发给我,我会把你添加到那个项目中,如果你想修复一个bug。如果你想让用户能够打开一个包含演示和单元测试项目的项目组,那么就需要超过2个文件。我认为这是值得做的,所以我添加了这些文件。 - Warren P
有点晚了,给你一个赞,答案很好,工作也很棒。从现在开始我会使用你的单位来哈希密码。 - jachguate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接