【问题标题】:Security Risks of Cient-Side Password Hashing [closed]客户端密码散列的安全风险[关闭]
【发布时间】:2025-12-10 09:50:02
【问题描述】:

我已经阅读了大量关于正确密码散列的所有博客文章、教程和 SO 问题。但是我还有一个关于客户端散列的风险的问题。

我想用 JavaScript 在客户端对用户密码进行加盐和散列处理,然后在服务器上进行重新散列和加盐处理,所有数据都通过 HTTPS(非纯文本)发送。客户端的散列不会使用与服务器相同的盐或算法。

从逻辑上讲,对于服务器来说,用户的密码是一个散列,所以如果数据传输是纯文本的,那么密码是否被散列到攻击者都没有关系。如果读取 JavaScript,暴露客户端哈希,理论上是否更容易获得已知长度和字符(0-9 和 af)的哈希,然后是获得可变长度和所有字母数字字符的密码、大小写和特殊字符?

例如,客户端的基本 MD5 散列(我知道 MD5 不好)会产生 128 位(16 字节)散列。因此,如果有 16 个可能的字符,则有 16^16 = 1.84e19 个可能的哈希值。

密码长度为 8-10 个字符,可以从任何字母数字或特殊字符中选择(Wikipedia's count,即 95)。得到 95^8 + 95^9 + 95^10,等于 6.05e19。正如您所看到的,这是密码数量的 3 倍多,是哈希值的 3 倍多(而且这个数字只会在您允许密码的时候变得更高)。

那么不从客户端向服务器发送散列密码不是更好吗?

作为这个问题的第二部分,从阅读资料中,我了解到可以使用字典等工具从逻辑上减少这种可能性。这些工具真的可以将结果缩小到 1.84e19 哈希组合以下吗?

【问题讨论】:

  • 有什么意义?如果您不是信息安全专家,请不要试图成为一名信息安全专家。找出当前的最佳做法是什么,然后去做。
  • 等等——你是说你想对密码进行哈希处理,但这个问题是关于为什么你想这样做可能是错误的?如果是这样,在我看来,是的。让您的登录页面使用 TLS (https) 并依赖它。

标签: php javascript security web-applications hash


【解决方案1】:

在客户端进行散列是没有意义的。然后你所做的就是让你的应用程序依赖于javascript。

可以读取传输的攻击者无论如何都可以直接将哈希提交给服务器,而无需输入密码。

HTTPS 完全保护传输时的用户密码。除非他们在聪明的攻击者范围内使用无线键盘。呵呵。

【讨论】:

  • 重点是保护用户的密码。但是很好的 +1 说明第 3 方听众不需要数据并且可以简单地使用哈希。