如何在PHP应用程序中提供bcrypt(我应该)?

时间:2010-08-23 23:29:31

标签: php security passwords bcrypt

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

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

现在,PHP本身支持the crypt function中的bcrypt(尽管误导性地简称为'blowfish')。但是,5.3之前的版本需要系统本身的支持,通常由crypt_blowfish提供。 phpass是相同的,建议安装PHP 5.3或Suhosin

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

我想过只创建一个纯粹的pcrypt的PHP端口,但是看the source of jBCrypt,我不确定我应该这样,因为我对PHP或河豚不太熟悉,而且是一个错误这可能同时是危险的,并且首先很难被发现。

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

  1. 我缺乏PHP知识是否能让我受益匪浅?我真的可以使用已经创建的实现吗?
  2. 我是否应该只创建一个简单的loooping函数,重复调用sha1()md5()一段可配置的次数?

3 个答案:

答案 0 :(得分:7)

  

我缺乏PHP知识是否能让我受益匪浅?我真的可以使用已经创建的实现之一吗?

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

  

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

关于密码学的最佳建议是“不要自己动手”。重复拨打sha1()md5() 可能会或可能不会提高安全性。

另一方面,bcrypt的作者在this paper上解释了他们的设计决定。

答案 1 :(得分:1)

不幸的是,你不能在Blowfish上使用bcrypt,除非你使用的是PHP 5.3或使用Suhosin扩展,或者操作系统可能在其bcrypt实现中支持Blowfish。

所以在这种情况下你最好的选择是使用SHA-256或SHA-512和key stretching(当然还有盐)。但在安全方面,滚动自己的解决方案绝不是一个好主意。

答案 2 :(得分:1)

你没有触及的phpass的一个好处是,如果CRYPT_BLOWFISH不可用,它会自动回退到使用DES,最后MD5作为底层密码。包装器以这样的方式使用它们,即使md5实现也比简单的哈希更安全。