6

我正在为一个相对成熟的开源 PHP 项目做贡献。最近,我发现它将密码存储为普通的 MD5 哈希,这对我来说很麻烦。我想如果我要修复它,我不妨做对(tm),所以我想使用 bcrypt。

首先,我对其他语言的发现:bcrypt-ruby似乎使用了来自 OpenBSD 的原始 C 代码或jBCrypt的 java 代码。 py-bcrypt是 BSD 代码的精简包装器。 BCrypt.net是 jBCrypt 的直接端口

现在,PHP 本身在crypt 函数中支持 bcrypt(尽管被误导地简称为“blowfish”)。但是,5.3 之前的版本需要系统本身的支持,通常由crypt_blowfish提供。 phpass也是一样,建议安装 PHP 5.3 或Suhosin

由于该应用程序的许多用户使用标准共享主机,我不想要求对服务器进行任何特殊配置。我希望只是从 PHP 的 5.3 版本中窃取代码,但它是用 C 语言编写的,并且(从我刚刚完成的一小部分阅读中)我不能要求项目用户使用 C 扩展。

我想只创建一个纯 PHP 的 bcrypt 端口,但是查看jBCrypt 的来源,我不确定我是否应该这样做,因为我对 PHP 或河豚都不是非常熟悉,而且这里可能同时出现错误首先是危险且难以检测的。

因此,我向您提出两个(多部分)问题:

  1. 是我缺乏 PHP 知识让我变得最好吗?我真的可以使用已经创建的实现之一吗?
  2. 我是否应该只创建一个简单的循环函数来调用sha1()md5()重复一些可配置的次数?
4

3 回答 3

7

是我缺乏 PHP 知识让我变得最好吗?我真的可以使用已经创建的实现之一吗?

不幸的是,你是对的。在 5.3.0 之前,PHP 默认不支持 bcrypt。相反,它依赖于操作系统的支持(检查CRYPT_BLOWFISH常量)。正如您所指出的那样,Suhosin是一种选择。

我是否应该只创建一个简单的循环函数来重复调用 sha1() 或 md5() 一些可配置的次数?

谈到密码学时,最好的建议是“不要自己动手”。重复调用sha1()md5() 可能会或可能不会增加安全性。

另一方面,bcrypt 的作者在这篇论文中解释了他们的设计决策。

于 2010-08-23T23:34:43.777 回答
1

不幸的是,除非您使用的是 PHP 5.3 或使用 Suhosin 扩展,或者操作系统可能在其 bcrypt 实现中支持 Blowfish,否则您不能将 bcrypt 与 Blowfish 一起使用。

因此,在这种情况下,您最好的选择是使用带有键拉伸的 SHA-256 或 SHA-512 (当然还有盐)。但是,就安全性而言,推出自己的解决方案绝不是一个好主意。

于 2011-08-12T08:02:05.807 回答
0

您没有提到的 phpass 的一个好处是,如果 CRYPT_BLOWFISH 不可用,它会自动回退到使用 DES,最后使用 MD5 作为基础密码。包装器以这样的方式使用这些,即使是 md5 实现也比简单的散列更安全。

于 2012-06-07T15:18:36.083 回答