PHP密码盐确实必要吗?

3

我已经问了自己这个问题好几次。

密码盐真的 必要 吗?

我没有找到任何好的相关文献。

从安全角度来看,密码盐有帮助吗? 如果数据库被入侵了,即使密码也丢失了,盐也丢失了吗?

此外,从暴力破解的角度来看,如果我禁止IP,还需要存储盐吗?


2
你真的不应该在密码哈希上使用自己的盐,而应该使用PHP的[内置函数](http://jayblanchard.net/proper_password_hashing_with_PHP.html)来处理密码安全。如果你正在使用低于5.5版本的PHP,可以使用`password_hash()` 兼容性包 - Jay Blanchard
2
“真的有必要存储盐吗?”:只有当您想要验证明文密码与存储的哈希值是否匹配时才需要。盐是开始加密的一点随机性。如果没有盐,给定的密码将始终生成相同的哈希值。 - Brad Kent
1
是的,它们很有帮助。是的,即使数据库被攻破也是如此。是的,即使您禁止IP也是如此。是的,它们是必要的。https://en.wikipedia.org/wiki/Salt_(cryptography) - ceejayoz
4个回答

4

是的,你应该 总是 使用盐。幸运的是 PHP 相当聪明。从这篇文章中可以了解到:

如果您使用password_hash()函数的默认选项,PHP 会为每个密码生成一个随机盐,并对其进行哈希处理。随机盐是一种额外的安全层,使破解任何密码变得异常困难。即使两个或多个用户使用相同的密码,它们的哈希值也将不同。

这让您无需生成盐,并将重活交给了 PHP。验证部分password_verify(),使用散列中的随机盐来测试给定的密码。

password_verify() 的文档中可以了解到:

请注意,password_hash() 返回算法、成本和盐作为返回的哈希的一部分。因此,验证哈希所需的所有信息都包含在其中。这允许验证函数在不需要单独存储盐或算法信息的情况下验证哈希。


password_verify 如何在没有来自密码本身的额外信息的情况下检索 password_hash - Gjert
更新答案@GjertIngarGjersund。如果您阅读文章,您将会更好地了解情况。 - Jay Blanchard
谢谢你的回答 :) - Gjert
2
简而言之:password_hash 生成的哈希包含三个部分。用于生成哈希的算法、使用的盐以及生成的哈希本身。长话短说:请使用这两个函数。不要自己编写密码哈希方法,否则会出错。 - Brad Kent
1
你可以获取哈希值,但它们对你没有任何好处,因为它们无法被逆向工程。它们是单向哈希函数,你的登录系统要求在继续之前将密码与哈希值进行比较。 - Jay Blanchard

3

你需要进行盐值加密,因为未加盐的哈希太容易被破解(使用彩虹表)。

首先,未加盐的哈希导致更多的冲突。如果两个密码都使用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()。无论你做什么,都不要自己编写安全算法,特别是关于密码存储方面。你一定会遭受损失。
要获取更多信息,请阅读为什么盐值哈希更安全?。你也可以花些时间阅读OWASP的密码存储备忘单PHP安全备忘单

1

它有助于防止“彩虹表”攻击,这些攻击是预编译的已知密码哈希值。当您为密码添加盐时,这些攻击将变得无效,因为哈希值将不同。


1
我想指出使用盐的真正目的。如另一个答案所解释的那样,不同的盐会导致相同密码的不同哈希值,但这并不是主要目的。
使用不同的盐来加密每个密码,可以防止一次性构建一个包含所有密码的彩虹表。
正如您所写的,盐不是秘密。为了获取单个密码,攻击者仍然可以使用已知的盐构建彩虹表。问题是,他(她)必须为第二个密码构建第二个彩虹表,因为它使用了不同的盐。换句话说,第一个彩虹表不能被重用以找到其他密码。
构建彩虹表只为了获取一个密码是没有意义的,更容易的方法是暴力破解直到找到匹配项,计算剩余的彩虹表是无用的,因为你无法重复使用它。这就是为什么我们说,唯一的盐可以防止彩虹表攻击,因为暴力破解比使用彩虹表更快。

这是最好的答案。 - Phyllis Sutherland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接