散列密码和处理重复密码

信息安全 密码
2021-08-11 15:08:04

目前我的项目仍然使用 MD5 散列来加密密码。是的,我知道。

我计划更新密码系统以使用 PHP 中较新的password_hash功能password_verify,这将提高用户密码的安全性。

但是,我的版主团队提出了一个担忧:由于我们的核心规则之一禁止用户拥有多个帐户,因此他们需要判断两个帐户是否属于同一个人的方法。他们使用的一种方法是检查两个可疑帐户的 MD5 哈希值是否相同 - 如果是,则这些帐户具有相同的密码并且怀疑会加剧。但是对于提议的新系统,这将不再可能,因为两个账户会产生不同的哈希值。

为了找到妥协,有没有办法使用更好的安全性password_hash,同时仍然为主持人团队提供一种方法来检测两个帐户何时共享相同的密码?

我目前的想法涉及以其他方式对密码进行哈希处理,这将为相同的密码产生相同的哈希值,但我担心这会重新引入我们试图通过远离 MD5 来逃避的相同漏洞. 这里是否有任何选择,或者我是否必须使用行政决策权来否决问题?

4个回答

password_hash 对同一个密码产生不同结果的原因之一是为了防止信息泄漏,并且如果攻击者获得了哈希值,则使密码更难破解。您真的不想损害此安全功能 - 它不仅会减少对客户数据的保护,而且您还将推出自己的解决方案,而不是使用得到良好支持和接受的解决方案。

无论如何,使用相同的密码来检测同一帐户持有人的多个帐户是一个坏主意——它必然会导致误报并导致您阻止合法帐户。

XY 问题

您所拥有的是经典的XY 问题( xyproblem.info )。您希望防止用户拥有多个帐户,并错误地认为实施损坏的密码系统并比较哈希值将帮助您解决此问题。所以你问如何检测相同的密码。正如@Ggd 的回答所描述的那样,尝试这样做会导致误报,很容易被规避,并迫使您放弃经过验证的密码处理实践。

解决您的实际问题

您的实际问题是“如何防止用户拥有多个帐户?”。 这个问题以前有人问然而,一个问题来自 2008 年,甚至提到“具有相同密码的帐户”作为缓解因素,另一个问题没有详细说明/选项,因此似乎应该重新讨论这个问题。

正如您和您的公司已经发现的那样,没有简单且万无一失的解决方案。您可以做的是采取明智的多方面努力来最大程度地减少问题。有效检查包括:

  • IP 日志记录:这可能会为共享单个面向公众的 IP 的组创建误报,并且可以通过使用代理、tor 或 DHCP 请求来避免。然而,这可能是调查这种可能性的良好第一步。
  • 电子邮件验证:要求用户提供并单击电子邮件验证是另一种有效但易于绕过的检查。
  • 手机验证:类似于电子邮件,但需要在注册(侵入性较小)或登录时通过 SMS 验证(侵入性更强,如果电话/信号不可用,可能会拒绝服务)。
  • 跟着钱走:需要信用卡或链接到有效的 PayPal(或其他服务)帐户。可能执行微交易并请求详细信息以证明帐户在用户的控制之下。
  • 特定领域的凭证:用户群是否需要认证(例如,注册护士的站点可能需要有效的许可证号)?

您的问题的实际解决方案无疑需要平衡。你不想让进入门槛太高的用户望而却步,除非你更关心“一个人,一个账户”而不是增长和牵引力。作为权衡的一部分,您绝对不希望使用错误的密码系统危及用户的帐户安全:违规的法律、财务和声誉成本远远超过任何(可疑的)收益。

我想说有一种方法可以安全地做到这一点 - 基于您问题中的以下陈述:

他们使用的一种方法是检查两个可疑帐户的 MD5 哈希值是否相同

这要求的不是一种使用相同密码自动识别任何一对帐户的方法。一旦已经存在怀疑,您只需要一种方法来确定一对帐户是否共享相同的密码。

基于此,我将解决这样的问题:

  1. 使用加盐哈希安全地存储密码。
  2. 创建一个附加表,列出怀疑使用相同密码的账户对,以及每对账户的状态。
  3. 当怀疑一对使用相同的密码时,将其插入状态设置为unknown的怀疑表中。
  4. 每次成功登录后在可疑表中搜索用户。
  5. 如果在可疑表中找到用户,则针对该对中的其他用户测试密码。如果状态未知,则将其更改为相同不同

当然,正如其他人所指出的,密码相同只是众多信号之一。最可靠的方法是组合许多不同的信号。我在此提出的验证方法只能用作最后的措施,前提是它会在怀疑低于或高于采取行动的阈值之间产生差异。

如果其他信号可以清楚地将帐户对放在阈值的一侧而不考虑密码的等效性,那么首先不需要将其放入可疑表中。

有一种方法可以检查密码是否与任何密码不匹配。

您可以在更改密码时,针对数据库中的所有其他密码验证该单一密码,因为您将拥有未加密的密码。这可能需要一段时间,但这是可行的。这很容易导致 DoS 攻击,因为单个操作可能会导致长时间的高 CPU。此外,您会密切关注哪些用户具有匹配的密码,这可用于确定要破解哪些密码的优先级。已经拥有所有密码和具有匹配密码的用户列表的攻击者可能会尝试首先暴力破解多个帐户的密码。

正如其他答案所说,我认为这不应该是用于确定重复帐户的方法。从同一 IP 访问的多个帐户可能会提供更少的误报。最好安装一个 cookie 来指示上次登录的用户,并在该 cookie 与当前登录的用户不匹配时安静地登录。