2012-03-14 32 views
14

我试图找到一个我可以在Delphi中使用的bcrypt实现。关于谷歌带给我的唯一有用的东西是this download page,其中包含一个名为bcrypt.h的winapi单位的翻译标题。但是当我看到它提供的功能时,bcrypt.h似乎并不包含任何使用Blowfish算法来散列密码的方法!是否有可用于Delphi的bcrypt实现?

我发现了一些C的bcrypt实现,我可以建立一个DLL并链接到它们,除非它们似乎都需要* nix或者是GCC特定的,所以这也不起作用!

这是八九不离十推动我逼疯了。我认为可以很容易找到一个实现,但似乎并不是这种情况。有谁知道我可以在哪里得到一个?

+2

你准备好考虑Vista中引入的Windows bcrypt吗? JEDI有一个头文件翻译:JwaBCrypt.pas – 2012-03-14 22:11:45

+0

@David:这似乎是我在问题中提到的bcrypt.h winapi头文件的另一个翻译版,它实际上并未包含Blowfish密码哈希实现。 (或者我错过了什么?) – 2012-03-14 22:21:51

+0

鲁迪的头是JEDI的起源之一,http://blog.delphi-jedi.net/2008/03/10/new-and-additional-header-files-from-rudy/ – 2012-03-14 22:33:00

回答

18

好了,所以我写的。

用法:

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编码

所以这就是为什么HashPasswordCheckPassword功能需要WideString(又名UnicodeString),并在内部将它们转换为UTF-8。如果你在一个版本的Delphi,其中UnicodeString是一个保留字运行这一点,那么简单地定义出来:

type 
    UnicodeString = WideString; 

我,大卫·赫弗南知道,不要自己德尔福XE 2.我添加了UnicodeString别名,但不包括compilers.inc并定义为UnicodeString(因为我不知道定义名称,我也不能测试它)。你想从免费代码中得到什么?

的代码包括两个单元:

  • Bcrypt.pas(我写的,具有嵌入的DUNIT测试)
  • Blowfish.pas(其戴夫巴顿写,这是我适于在延伸,固定一些错误并加入DUNIT测试)。

哪里可以在intertubes上放一些代码,它可以永久生活吗?

更新1/1/2015:它被放在GitHub前一段时间:BCrypt for Delphi

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

+2

Perpetuity?真的没有。但SourceForge,谷歌代码,GitHub或BitBucket是很好的候选人,应该在很长的一段时间。 – afrazier 2012-05-04 04:16:10

+0

现在将答案中的文件名('bcrypt.pas','blowfish.pas')链接到pastebin。 – 2012-05-04 13:26:48

+0

真的应该把这个放在Bitbucket上! – 2012-09-27 03:01:35

相关问题