我已经问了十几次这个问题。
密码盐是否真的必要?
我无法找到关于这个主题的任何好文献。
从安全角度来看,密码盐有帮助吗? 如果数据库被破坏,如果密码是反正的话,盐是否会丢失?
另外,从刷力的角度来看,如果我禁止IP,是否真的有理由储存盐?
答案 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)
我想指出使用盐的真正目的。正如另一个答案所解释的那样,不同的盐导致相同密码的不同哈希,但这不是 的主要目的。
对每个密码使用不同的盐,可以防止构建一个彩虹表以立即获取所有密码。
正如你所写,盐并不是秘密。要获得单个密码,攻击者仍然可以使用这种已知的盐构建彩虹表。问题是,他必须为第二个密码构建第二个彩虹表,因为它使用了不同的盐。换句话说,第一个彩虹表不能重复用于查找其他密码。
构建彩虹表只能获得一个密码是没有意义的,在找到匹配项之前更容易暴力破解,计算彩虹表的其余部分是没用的,因为你无法重复使用它。这就是为什么我们说,独特的盐可以防止彩虹表攻击,因为暴力攻击比使用彩虹表更快。