Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP应用程序中销售bcrypt(我应该这样做吗)?_Php_Security_Passwords_Bcrypt - Fatal编程技术网

如何在PHP应用程序中销售bcrypt(我应该这样做吗)?

如何在PHP应用程序中销售bcrypt(我应该这样做吗)?,php,security,passwords,bcrypt,Php,Security,Passwords,Bcrypt,我正在为一个相对成熟的开源PHP项目做贡献。最近,我发现它将密码存储为普通的MD5散列,这对我来说相当麻烦。我想如果我要修复它,我还不如把它做对(tm),所以我想使用bcrypt 首先,我在其他语言中发现:似乎使用了OpenBSD中的原始C代码或java代码。是BSD代码的薄包装。是一个直达的港口 现在,PHP本身在中支持bcrypt(尽管被误称为“河豚”)。但是,5.3之前的版本需要系统本身的支持,通常由提供。相同,建议安装PHP5.3或 由于应用程序的许多用户使用标准的共享主机,所以我不想要

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

首先,我在其他语言中发现:似乎使用了OpenBSD中的原始C代码或java代码。是BSD代码的薄包装。是一个直达的港口

现在,PHP本身在中支持bcrypt(尽管被误称为“河豚”)。但是,5.3之前的版本需要系统本身的支持,通常由提供。相同,建议安装PHP5.3或

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

我曾想过只创建一个纯PHP的bcrypt端口,但现在来看,我不确定我是否应该这样做,因为我对PHP或blowfish都不太熟悉,而且这里的错误可能同时是危险的,而且一开始就很难发现

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

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

    不幸的是,你是对的。5.3.0之前的PHP默认不支持bcrypt。相反,它依赖于操作系统的支持(检查
    CRYPT\u BLOWFISH
    常量)。正如你所指出的,在这种情况下,这是一种选择

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

    当涉及到加密时,最好的建议是“不要自己滚”。重复调用
    sha1()
    md5()
    可能会增加安全性,也可能不会


    另一方面,bcrypt的作者解释了他们的设计决策。

    不幸的是,除非您使用的是PHP5.3或Suhosin扩展,或者操作系统在其bcrypt实现中支持Blowfish,否则不能将bcrypt用于Blowfish


    因此,在这种情况下,最好使用SHA-256或SHA-512(当然还有盐)。但是,在安全性方面,推出自己的解决方案从来都不是一个好主意。

    phpass的一个好处是,如果CRYPT\u BLOWFISH不可用,它会自动退回到使用DES,最后使用MD5作为基础密码。包装器以这样的方式使用它们,即使是md5实现也比简单的散列要安全得多。

    +1表示不加密密码。应该始终使用散列。Null,您是否有任何资源可以用于下面的问题?还要注意,我投票支持您,即使您认为bcrypt有错。:)@西奥多已经一年了,但我编辑了答案,所以现在它实际上回答了这个问题。