【问题标题】:Is PHP password salt really necessary?PHP密码盐真的有必要吗?
【发布时间】:2016-05-04 21:28:09
【问题描述】:

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

密码盐真的有必要吗?

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

从安全角度来看,密码盐有帮助吗? 如果数据库被破坏,如果密码仍然存在,盐不会丢失吗?

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

【问题讨论】:

  • 你真的不应该在密码哈希上使用你自己的盐,你真的应该使用 PHP 的built-in functions 来处理密码安全。如果您使用的 PHP 版本低于 5.5,则可以使用 password_hash() compatibility pack
  • “真的有任何理由存储盐吗”:仅当您希望能够根据存储的哈希验证明文密码时。盐是开始加密的一点随机性。如果没有盐,给定的密码将始终生成相同的哈希值。
  • 是的,他们有帮助。是的,即使数据库被破坏。是的,即使您禁止 IP。是的,它们是必要的。 en.wikipedia.org/wiki/Salt_(cryptography)

标签: php database hash passwords salt


【解决方案1】:

是的,您应该始终使用盐。幸运的是 PHP 非常聪明。来自this article

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

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

来自password_verify() 的文档:

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

【讨论】:

  • password_verify如何在没有直接来自密码的额外信息的情况下检索password_hash
  • 更新答案@GjertIngarGjersund。如果你读了这篇文章,你会得到一个更好的画面。
  • 谢谢你的回答:)
  • 简而言之:password_hash 生成的哈希包含 3 个内容。用于生成散列的算法、使用的盐和生成的散列。长回答短:使用这两个功能。不要使用自己的方法来散列密码 - 你会做错的。
  • 您可以检索哈希,但它们对您没有好处,因为它们不能被逆向工程。它们是哈希的一种方式,您的登录系统需要在允许继续之前将密码与哈希进行比较。
【解决方案2】:

确实需要加盐,因为未加盐的哈希太容易破解(使用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

【讨论】:

    【解决方案3】:

    它确实有助于对抗“彩虹表”,这是已知密码的预编译哈希。当你给密码加盐时,它们是没用的,因为哈希值会不同。

    【讨论】:

      【解决方案4】:

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

      通过为每个密码使用不同的盐,您可以防止构建一个彩虹表来一次获取所有密码

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

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

      【讨论】:

      • 这是最好的答案。
      猜你喜欢
      • 2012-07-04
      • 2018-04-05
      • 2021-01-25
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      相关资源
      最近更新 更多