PHP密码盐真的有必要吗?

时间:2016-01-27 18:52:41

标签: php database hash passwords salt

我已经问了十几次这个问题。

密码盐是否真的必要?

我无法找到关于这个主题的任何好文献。

从安全角度来看,密码盐有帮助吗? 如果数据库被破坏,如果密码是反正的话,盐是否会丢失?

另外,从刷力的角度来看,如果我禁止IP,是否真的有理由储存盐?

4 个答案:

答案 0 :(得分:6)

是的,你总是使用盐。幸运的是,PHP非常聪明。来自this article

  

如果您使用password_hash()函数的默认选项 PHP将为每个密码生成随机盐,因为它已经过哈希处理。 随机盐是一个额外的安全层,这使得破解任何密码非常困难。即使两个或更多用户使用相同的密码,他们的每个哈希都会有所不同。

这使您无需生成盐并将繁重的工作留给PHP。验证部分password_verify()使用散列在散列中的随机盐来测试给定的密码。

来自password_verify()的文档:

  

请注意,password_hash() 会返回算法,费用和salt作为返回哈希的一部分。因此,验证哈希所需的所有信息都包含在其中。这允许验证函数验证散列,而无需为salt或算法信息单独存储。

答案 1 :(得分:3)

需要加盐,因为未加盐的哈希太容易破解(使用rainbow tables)。

首先,未加盐的哈希导致更多的碰撞。如果两个密码使用baseball作为密码,那么破解密码就足以破解这两个密码。如果两者都被腌制,那么一个变为baseball#sd7#$j而一个变为baseballL4&$h1,那就不起作用。

其次,如果没有盐渍,使用彩虹表可以很容易地反转像baseball甚至*4kB$l!h_'这样的密码。这是因为创建一个覆盖所有密码的彩虹表很容易。但是,如果正确腌制,*4kB$l!h_'可能会变成*4kB$l!h_'H4Sj$8)@80-+2nm:W[oa}u#*4$lNamA{或其他荒谬的长度。为此生成彩虹表要困难得多。

使用PHP,让您的生活更轻松,只需使用password_hash()即可。无论你做什么,都不会推出自己的安全算法,,特别是在密码存储方面。 会被烧毁。

如需了解更多信息,请阅读Why are salted hashes more secure?您可能还需要花一些时间与OWASP's Password Storage Cheat Sheet同在,PHP Security Cheat Sheet

答案 2 :(得分:1)

它有助于对抗'rainbow tables',它们是已知密码的预编译哈希值。当你加密密码时,它们就没用了,因为哈希会有所不同。

答案 3 :(得分:1)

我想指出使用盐的真正目的。正如另一个答案所解释的那样,不同的盐导致相同密码的不同哈希,但这不是 的主要目的。

对每个密码使用不同的盐,可以防止构建一个彩虹表以立即获取所有密码

正如你所写,盐并不是秘密。要获得单个密码,攻击者仍然可以使用这种已知的盐构建彩虹表。问题是,他必须为第二个密码构建第二个彩虹表,因为它使用了不同的盐。换句话说,第一个彩虹表不能重复用于查找其他密码。

构建彩虹表只能获得一个密码是没有意义的,在找到匹配项之前更容易暴力破解,计算彩虹表的其余部分是没用的,因为你无法重复使用它。这就是为什么我们说,独特的盐可以防止彩虹表攻击,因为暴力攻击比使用彩虹表更快。