我已经问了自己这个问题好几次。
密码盐真的 必要 吗?
我没有找到任何好的相关文献。
从安全角度来看,密码盐有帮助吗? 如果数据库被入侵了,即使密码也丢失了,盐也丢失了吗?
此外,从暴力破解的角度来看,如果我禁止IP,还需要存储盐吗?
我已经问了自己这个问题好几次。
密码盐真的 必要 吗?
我没有找到任何好的相关文献。
从安全角度来看,密码盐有帮助吗? 如果数据库被入侵了,即使密码也丢失了,盐也丢失了吗?
此外,从暴力破解的角度来看,如果我禁止IP,还需要存储盐吗?
是的,你应该 总是 使用盐。幸运的是 PHP 相当聪明。从这篇文章中可以了解到:
如果您使用
password_hash()
函数的默认选项,PHP 会为每个密码生成一个随机盐,并对其进行哈希处理。随机盐是一种额外的安全层,使破解任何密码变得异常困难。即使两个或多个用户使用相同的密码,它们的哈希值也将不同。
这让您无需生成盐,并将重活交给了 PHP。验证部分password_verify()
,使用散列中的随机盐来测试给定的密码。
从 password_verify()
的文档中可以了解到:
请注意,
password_hash()
返回算法、成本和盐作为返回的哈希的一部分。因此,验证哈希所需的所有信息都包含在其中。这允许验证函数在不需要单独存储盐或算法信息的情况下验证哈希。
password_verify
如何在没有来自密码本身的额外信息的情况下检索 password_hash
? - Gjertpassword_hash
生成的哈希包含三个部分。用于生成哈希的算法、使用的盐以及生成的哈希本身。长话短说:请使用这两个函数。不要自己编写密码哈希方法,否则会出错。 - Brad Kent你需要进行盐值加密,因为未加盐的哈希太容易被破解(使用彩虹表)。
首先,未加盐的哈希导致更多的冲突。如果两个密码都使用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{
或其他荒谬的长字符串。为此生成彩虹表要困难得多。
它有助于防止“彩虹表”攻击,这些攻击是预编译的已知密码哈希值。当您为密码添加盐时,这些攻击将变得无效,因为哈希值将不同。