使用静态盐的客户端密码散列 - 我发现违规了吗?

信息安全 验证 密码 哈希 md5
2021-09-06 00:43:40

我下载了一个有登录界面的软件。这是一个每月 100 美元的订阅软件。

我反汇编了软件,发现密码是通过将它们与每个人都可以在源代码中看到的硬编码“盐”结合起来发送的(如果每个人都一样,那真的是“盐”吗?),用 MD5 对它们进行哈希处理,然后将哈希发送到服务器。

希望在服务器端再次对密码进行哈希处理,并为每个用户使用唯一的盐,但即使他们这样做了,这不是违规吗?攻击者不能轻松地嗅探密码,或者进行发送哈希攻击吗?

3个回答

这取决于。您的问题中没有足够的信息来给出具体的答案,并且可能在不了解服务器端的情况下,很难评估。

这不是违约吗?

我暂时不会称其为违规行为,因为仅知道客户端对密码进行哈希处理这一事实并不会泄露有关此帐户或其他帐户的任何敏感信息。

攻击者不能轻松地嗅探密码,或者进行发送哈希攻击吗?

如果攻击者可以嗅探客户端和服务器之间的通信,则无论发送原始密码还是其哈希版本都没有区别。在这两种情况下,攻击者都拥有所需的凭据。现在唯一可以阻止他们的是两因素身份验证。

对付嗅探的最好办法是强制使用 HTTPS 进行通信。

如果每个人都一样,它真的是“盐”吗?

不,是添加到单向哈希函数中的一些随机数据,以保护存储中的密码。盐必须是随机的并且对于每个密码都是唯一的,并且应该足够长以防止创建具有所有可能盐组合的彩虹表。

它也不是辣椒,因为辣椒一定是秘密的。

为什么首先要在客户端散列密码?

在将密码提交到服务器之前在客户端对密码进行哈希处理,只需将生成的哈希值转换为新密码。虽然它在身份验证过程中没有提供额外的安全性,但它通常保护用户的密码(特别是如果他们也在其他地方使用它):明文密码永远不会被服务器传输或处理。如果服务器(相对于数据库)曾经被入侵,那么提取原始密码将更加困难。

PS:使用像 md5 或 sha 这样的散列函数散列一些东西与加密一些东西是不同的。加密数据可以解密,但是散列数据无法恢复,因为散列是一种单向函数。

这不是违约。

当有人获得他们不应该拥有的数据时,就会发生违规行为。虽然您已经发现了有关其身份验证过程的一些(合法相关的)详细信息,但您还没有发现任何敏感的客户数据。

攻击者也不能像您暗示的那样轻松利用这一点。攻击者当然可以嗅探流量,并且由于他们知道哈希值,因此可以破解他们看到的密码。然而,一般来说,他们能够嗅到的唯一密码是来自他们自己机器的密码。反正他们很可能已经知道这些了。

只有当攻击者设法真正窃取散列密码(或其他敏感数据)时,才会发生违规行为。在那个时间点,恒定的盐将使攻击者的生活更轻松:他们可以预先为常用密码生成一个彩虹哈希表,并预先使用盐(这将非常容易,因为使用了 MD5),然后他们可能会一旦数据实际被盗,能够快速“反转”许多密码。

需要明确的是,使用带有恒定哈希的 MD5 是非常糟糕的密码安全性。总是有可能在服务器端采取额外的步骤来确保它的安全,但是 MD5 已经被弃用了很长时间,以至于我真的怀疑它。一般来说,任何使用密码身份验证甚至认为关于实际使用 MD5 不知道他们在做什么。因此,虽然他们可能在服务器端拥有更多更好的安全性,但我认为他们的密码安全性实际上和看起来一样糟糕。因此,尽管您绝不会“破坏”他们的系统,但如果您自己熟悉如何(为您)安全地执行此类操作并且可以连贯地解释为什么这是一个坏主意,那么向他们的安全团队提出这个问题可能是一种合理的方法.

  • 推断客户端和服务器之间的通信通道是安全的(如配置良好的 TLS 隧道),发送损坏的密码或纯文本密码对身份验证机制没有直接的好处或损失。两者都容易受到重放攻击,只是在一种情况下重放密码,在另一种情况下重放转换后的密码。这本身并不是一个漏洞。

  • 但是,如果连接不安全(即明文),那么使用固定盐和 md5 散列来修改密码是保护敏感数据的糟糕方法,此外同样容易受到重放攻击。这是一个漏洞。