【问题标题】:How do I verify a password which is hashed using a random salt?如何验证使用随机盐散列的密码?
【发布时间】:2014-10-22 11:04:52
【问题描述】:

我正在开发一个网络应用程序。现在从安全角度来看,密码从客户端发送到服务器时需要加盐哈希。 现在我的问题是,如果我随机生成盐,将其附加到密码并散列组合,如何验证此密码。由于生成的盐是随机的,因此盐+密码组合每次都会不同。 如果我将生成的相同盐与用户凭据一起发送到服务器,这将暴露盐。暴露的盐会产生类似的麻烦,因为试图破解密码的人可以将暴露的盐与不同的密码附加到获取哈希并匹配它。 我检查了许多网站和有关堆栈溢出的问题,但没有一个完全符合我的需要。

有一些工具可以读取浏览器的内存并窃取输入的密码。因此,客户端也需要加盐哈希。

【问题讨论】:

  • 不要在客户端进行密码散列。所有客户端代码都可以轻松修改,使您的“安全”变得无用。
  • 很明显,你对网络安全的理解是低的。因此,您为什么要浪费时间尝试实现自己的登录系统?几乎每个 Web 开发框架都已经解决了这个问题。您应该使用现有的工具和库来解决这个问题。正如您已经证明的那样,出现这种严重错误的风险是非常非常非常高。何苦?使用现成的解决方案并继续解决您实际尝试解决的问题。
  • @spender 建议您是否有解决方案。我试图描绘这种情况,我无法透露实际的架构。已实现各种安全功能,但客户端需要加盐哈希。
  • @Yasha“客户端需要加盐哈希”?这不是“安全功能”。这是一个安全漏洞。谁在推动这个要求?他们将您/您的团队引向错误的方向。
  • "有一些工具可以读取浏览器的内存并窃取输入的密码。因此客户端也需要加盐哈希。" - 这是不合逻辑的。如果您想长时间登录,请从服务器获取身份验证令牌,而不是将密码(或其哈希)存储在客户端。

标签: javascript sha256 owasp penetration-testing saltedhash


【解决方案1】:

您必须在代码的服务器端保留盐。

当您对用户进行身份验证时,您会将密码发送到服务器。服务器附加盐,然后散列密码。 salt 应该存储在服务器端代码或数据库中的某个位置。

您应该从不将 salt 发送到应用程序的客户端。

【讨论】:

  • 但我会避免将其存储在与相应哈希值相同的数据库中。
  • @NickRussler;将盐存储在不同的数据库中只是通过默默无闻的安全性。它增加了复杂性,但没有增加真正的额外安全性。如果一个数据库已被破坏,则可以假设其他数据库也是如此。正确使用盐的最重要方面是每个用户具有良好的随机性,并且将盐发送给客户端。
  • 重申一下:对每个密码使用不同的盐。否则,攻击者可以同时暴力破解数据库中的所有密码。 @sharpcloud,没有真正的理由来保证盐的安全。一般来说,我认为盐是公共信息。如果您想要另一道防线,请使用辣椒(您在源代码或配置中保密):security.stackexchange.com/questions/3272/…
  • 使用不同的盐是我期待的,但如何验证
  • @Yasha:将其与您的密码一起存储在数据库中。当您验证密码时,获取两者,使用给定密码和存储的哈希重新计算哈希,并将结果与​​存储的哈希进行比较。
【解决方案2】:

将盐保存在数据库中没有问题。加盐只是为了确保攻击者不会使用具有大量计算哈希值的表及其相应的密码来找出受感染数据库的密码。使用盐,攻击者的唯一选择就是暴力破解。

因此,为了让攻击者更难暴力破解并从哈希中找出密码,我建议为每个用户使用长且安全的随机盐。

很好的解释可以在Why do we use the "salt" to secure our passwords?找到

【讨论】:

  • 感谢您的链接,但我正在寻找随机盐的出路。我想避免暴力或彩虹表的任何可能性