【问题标题】:Why does salting a hashed password increase security?为什么加盐哈希密码可以提高安全性?
【发布时间】:2012-01-25 15:41:54
【问题描述】:

我一直在研究如何将密码安全地存储在数据库中。通常建议您使用盐。正如Secure hash and salt for PHP passwords 中的一个答案所解释的那样,这会改变哈希值,使密码更难破解。

作为验证机制的一部分,用户输入的密码与盐结合,并根据需要进行哈希处理。鉴于盐对用户是透明的,那么使用盐如何提供任何额外的好处?

在我看来,不管有没有散列,相同的密码都会成功地验证你的身份,因为使它与众不同的管道将在幕后进行。这就是为什么到目前为止我读过的文章都没有澄清事情的原因。

【问题讨论】:

标签: security salt


【解决方案1】:

考虑一个场景,您接受用户的密码并通过网络发送密码或以纯文本形式存储在数据库中。

如果您的用户输入的密码长度为 6-8 个字符。黑客可能已经为所有可能的 6-8 个字符长度的字符串预先生成了哈希值,并且他可以通过将其与您的哈希值进行比较来推断密码。(将您的哈希值与所有预先生成的哈希值相匹配,他可以获得一组可能的候选者,如果发生碰撞)

但是,如果您在他的纯文本密码中附加一个 30 个字符的盐,然后对其进行哈希处理。任何黑客都很难预先生成该范围的所有可能组合。这就是我们使用盐的主要原因。

出于安全考虑,您不能限制每个用户输入 30 个字符长的密码。如果任何用户选择了一个 4 字符长度的密码,只需添加 30 个字符的盐并使其更安全。

【讨论】:

  • 这基本上是正确的,但是在 4 字符的密码中添加 30 字符的盐并没有太大帮助。盐可以使任何密码计算唯一,因此获得哈希的攻击者不能使用预先计算的表。但是盐没有加密。在 SQL 转储中,SALT 将是显而易见的。所以破解一个四字符的密码还是很简单的。因为只有四个字符可以猜。它增加的安全性可以忽略不计。
  • @Eriend - 是的,加盐对 4 个字符的密码几乎没有增加安全性。但它使用更大的密码。安全性不在于破解个人密码。那仍然是蛮力时间。安全性在于,如果我在 50 个不同的网站上使用相同的密码,这些网站都使用不同的盐,即使你设法破坏了一个网站并找出我的明文密码和相应的哈希值,你也无法将该哈希值与存储在其他站点的哈希值 - 你也需要妥协/暴力破解它们。
  • 如果没有加盐,一旦找到已知哈希的明文,您就可以毫不费力地破解密码恰好具有相同密码的任何人。盐更多地是为了保护其他人免受一个假人的错误。当然,如果在破坏初始站点后,您认为我使用了相同的密码 - 您会很成功。但是,如果没有直接的方法将不同站点上的各种帐户直接关联到我,那么攻击者仍然有很多工作要做。
【解决方案2】:

加盐密码降低了rainbow table 中已经包含加盐密码哈希的可能性。

【讨论】:

  • 假设一个合适的盐(大的和随机的)和不受暴力破解的哈希算法(SHA-1 太快)。但是,是的,盐的主要目的......它绝对不是为了“秘密”而设计的(至少不超过它盐的哈希值:)
  • 彩虹表是基于典型的基于字典的密码,还是通过哈希本身计算出来的?
  • 彩虹表基本上是使用相同散列函数预先生成的散列。对于长度为 4 的字符串,会生成所有 4 个字符长度组合,并通过相同的散列函数传递并存储。如果将来您得到任何 4 字符长度的哈希,那么您只需在表中查找可能的候选人。
猜你喜欢
  • 1970-01-01
  • 2016-09-17
  • 2010-09-28
相关资源
最近更新 更多