Php 密码散列,BCrypt到SHA1/MD5

Php 密码散列,BCrypt到SHA1/MD5,php,encryption,hash,sha1,bcrypt,Php,Encryption,Hash,Sha1,Bcrypt,我一直在考虑升级我的一个应用程序的密码哈希安全性,因为我一直在阅读有关暴力攻击比以前快得多的内容。目前我正在使用sha1(md5($password))并且我看到了使用bcrypt+salt的好处。我的问题是,如果我这样做,会不会更安全: 场景1: $password -> sha1 -> bcrypt -> sha1 // This would enable me to keep all existing passwords and just // regenerate a

我一直在考虑升级我的一个应用程序的密码哈希安全性,因为我一直在阅读有关暴力攻击比以前快得多的内容。目前我正在使用
sha1(md5($password))
并且我看到了使用bcrypt+salt的好处。我的问题是,如果我这样做,会不会更安全:

场景1:

$password -> sha1 -> bcrypt -> sha1
// This would enable me to keep all existing passwords and just 
// regenerate all the hashes without waiting for the user to re login
$password -> bcrypt -> sha1
// I would have to add an extra column for the new hash until every
// user has logged in but the hash will still be sha1.
场景2:

$password -> sha1 -> bcrypt -> sha1
// This would enable me to keep all existing passwords and just 
// regenerate all the hashes without waiting for the user to re login
$password -> bcrypt -> sha1
// I would have to add an extra column for the new hash until every
// user has logged in but the hash will still be sha1.
这两种方法中的任何一种都会增加散列的安全性吗?我不是密码大师,离它很远,我只想简单地解释一下它是否能工作,如果不能,以及为什么

谢谢

编辑

在多读一点之后,bcrypt似乎更受欢迎,因为它的速度很慢,我让cpu/gpu在生成散列之前工作更长时间

在sha1与bcrypt的对比中,sha1的速度大约是bcrypt的300000倍。这就引出了一个问题,如果bcrypts的优点是速度慢,那么使用sha1 300000次的递归哈希函数肯定会像bcrypts一样安全吗

我以这个函数为例:

function bsha1($data, $salt) {

$hash = $data;

for ($i = 0; $i < 300000; ++$i) {

$hash = sha1($hash . $salt);

}
函数bsha1($data$salt){
$hash=$data;
对于($i=0;$i<300000;++$i){
$hash=sha1($hash.$salt);
}

为它提供一个salt,它将返回一个sha1哈希,其中每个迭代都是一个哈希哈希和salt。这与bcrypt花费的时间大致相同。这是否安全?

简短的回答是肯定的,这会有所帮助。但是长的回答是否定的,因为SHA-1和MD5现在只是弱哈希算法。最好只需使用SHA-2算法,甚至可以稍等片刻,直接进入SHA-3

问题在于散列函数。三层肯定会阻止某人,但老实说,大多数情况下一层足以让大多数人不必担心。如果有人非常想进入,我会使用SHA-2,至少在其他方面,你应该对你所拥有的一切很好

编辑::

好的,让我们澄清一下上面的问题。使用SHA1和Bcrypt并不一定是最好的方法。我会使用SHA-2算法和Bcrypt,这会比使用SHA-1提供更多的安全性。另外,层的意思是Bcrypt是一个散列传递,SHA-1是一个散列传递,第二个SHA-1是另一个散列传递。我真的不明白为什么会这样是不是错了?对不起,层的语义不同

编辑2::

$Password->Bcrypt->SHA-2
Bcrypt(SHA-2($Password))
其中
SHA-2
是SHA-2哈希算法家族之一

使用SHA-2而不是SHA-1,代码比Bcrypt更清晰。

您最好升级到

由于您可能还没有使用PHP5.5(我假设此时您已经在进行测试),因此可以使用

要在登录时升级密码散列,请从数据库获取散列,然后首先针对新散列进行测试。如果返回FALSE,则针对旧散列进行测试。如果返回TRUE,则使用新散列重新散列密码,并将其存储回数据库

相互结合或链接多个哈希——我担心我在你的问题中读到这是一个你根本不应该考虑的愚蠢问题。哈希算法不兼容,使用哈希散列的方式是错误的:<代码> Sh1(MD5($密码))等有效地减少了输出空间,使其更容易受到攻击—这是您希望在将来防止的


因此,以PHP中的新密码哈希API为例,好好睡一觉。

您可以使用任何标准哈希算法,但作为标准哈希函数,它们可以回溯,并且存在潜在的安全风险

您最好使用任何散列函数,但将其与salt和您的个人密钥相结合


这两种方案都没有给您提供比bcrypt更大的安全余量。也就是说,bcrypt绝对是一种能够抵抗暴力强制的哈希算法,因为它的成本系数足够高,哈希所需的时间比任何基于SHA的哈希方案都要长


综上所述,场景1可能是一个不错的选择,因为您现在可以保护数据库,而不是在用户登录时零碎地保护数据库。尽管M8R-1jmw5r在其回答中说,组合哈希算法不会给您带来任何额外的安全性,但也不会真正对您的安全性产生负面影响。

最好使用种子设定和附加密码例如:
md5(md5(uniqueid/seed).my5(password).md5(now()).md5(seed))
在一天结束的时候,你的所有建议都是链式加密。而sha1很容易被破解(就像md5一样,我只是以它为例)实现密码生成的随机性是最好的,我使用注册日期+每个用户的种子密钥+唯一的用户ID在多个过程中将它们链接在一起,然后是一个主过程。它仍然链接加密,但例如“password”变成“1230982348762 password89134598712390874”那么长度呢increases@Dave当前位置请不要建议自己滚动。滚动自己会让你感到孤独。取而代之的是社区认为有效的东西,如果研究发现某些部分存在缺陷甚至损坏,这不会让你感到孤独。这并不完全是滚动自己的行为,它基本上完全按照罗伯特的建议进行ed.仅供参考上面的例子正是如何在vbulletin中完成的。@Ozzy-不能说SHA-1比BCrypt快x倍,因为BCrypt散列了一个成本因子,它决定了所需的时间。这个成本因子是重要的一点。你对迭代的处理方式类似,但BCrypt做得更好。例如,它重用了salt和t他在每次迭代中都会使用原始密码,并且它是以一种使用更多内存的方式构建的,从而更难使用GPU进行暴力攻击。@Dave-在您的示例中,您使用了MD5 5次(