我在检查bcrypt哈希算法。
我使用password_hash()进行了第一次测试:
echo password_hash("123", PASSWORD_BCRYPT, array( "salt" => "1234567890123456789012" ));
echo password_hash("123", PASSWORD_BCRYPT, array( "salt" => "1234567890123456789012xxxxxxxxxxxxxxx" ));两者都将返回'$2y$10$123456789012345678901uiaLpJxTpf6VbfI5NADlsRsfvEm6aq9C'.
非常感谢!
发布于 2015-06-07 00:53:38
salt不是秘密,它通常与哈希一起存储在数据库中,还可以像password_hash一样直接存储在哈希中。
salt创建了惟一性,因此哈希不能轻易地用彩虹表或字典之类的东西破解,它除了使哈希更独特之外并没有真正增加安全性,因此对哈希运行字典或表不匹配,因为它还包括salt。
如果省略salt,password_hash()将为每个密码哈希生成一个随机的盐分。这是预定的操作模式,你不应该自己提供盐。
PHP7实际上会产生一个警告,告诉您使用salt选项是不可取的。
传递的盐分至少需要22个字符,但大多数底层算法,如bcrypt,不使用整个salt,有关更多信息,请参见这个答案
发布于 2015-06-07 00:56:18
盐不是你必须努力保守秘密的东西。即使在已知的情况下,它们的保护也是有效的。https://crackstation.net/hashing-security.htm
盐不一定是秘密的。仅仅通过随机化散列、查找表、反向查找表和彩虹表就会变得无效。攻击者不会事先知道盐是什么,所以他们无法预先计算查找表或彩虹表。如果每个用户的密码使用不同的salt进行散列,则反向查找表攻击也将无法工作。
由于您似乎使用的是固定的盐值,请注意以下事项:
一个常见的错误是在每个散列中使用相同的盐分。盐要么被硬编码到程序中,要么随机生成一次。这是无效的,因为如果两个用户有相同的密码,那么他们的哈希仍然是相同的。攻击者仍然可以使用反向查找表攻击同时对每个散列运行字典攻击。他们只需将盐分应用于每个密码猜测,然后再散列。如果盐是硬编码成一个流行的产品,查找表和彩虹表可以为该盐,使它更容易破解哈希产生的产品。
我建议使用没有可选参数的password_hash。默认函数构建为高度安全,通过指定您自己的算法和选项,您可能会削弱它的功能。
根据PHP文档
警告强烈建议您不要为该函数生成自己的salt。如果您不指定安全盐,它将自动为您创建一个安全盐。
编辑:,这就是为什么在bcrypt中保持盐的秘密是没有意义的。
每个这个职位有3,025,989,069,143,040个可能的组合,以一个8个字符的密码。您通常应该对bcrypt的工作因素进行调优,以便花费0.1秒来散列密码。这意味着计算所有可能性需要302,598,906,914,304秒。这是9588千禧年的。
https://stackoverflow.com/questions/30688957
复制相似问题