Hash 如何安全地检测具有匹配密码的帐户?

Hash 如何安全地检测具有匹配密码的帐户?,hash,cryptography,security,bcrypt,Hash,Cryptography,Security,Bcrypt,在我们的留言板上,我们使用密码匹配来帮助检测具有多个注册的成员,并强制执行针对恶意傀儡帐户的规则。当我们使用SHA256哈希和每个站点的salt时,它工作得很好。但我们最近遇到了一个令人谦卑的安全漏洞,其中许多密码散列落入了字典攻击。因此,我们强制更改密码,并切换到bcrypt+每用户 当然,现在密码匹配不再有效。我没有接受过正规的密码学或计算机科学教育,所以我想问一下是否有一种安全的方法来克服这个问题。我的同事建议使用松散散列算法创建第二个密码字段,故意造成大量冲突,但在我看来,这要么会导致大

在我们的留言板上,我们使用密码匹配来帮助检测具有多个注册的成员,并强制执行针对恶意傀儡帐户的规则。当我们使用SHA256哈希和每个站点的salt时,它工作得很好。但我们最近遇到了一个令人谦卑的安全漏洞,其中许多密码散列落入了字典攻击。因此,我们强制更改密码,并切换到bcrypt+每用户

当然,现在密码匹配不再有效。我没有接受过正规的密码学或计算机科学教育,所以我想问一下是否有一种安全的方法来克服这个问题。我的同事建议使用松散散列算法创建第二个密码字段,故意造成大量冲突,但在我看来,这要么会导致大量误报,要么会使搜索空间过大而不安全。我的想法是坚持使用bcrypt,但存储第二个密码散列,该散列使用每个站点的salt和极高的迭代计数(比如在现代硬件上生成10秒以上)。这样,具有相同密码的用户将具有相同的哈希值,但无法通过字典攻击轻松推断

我只是想知道这是否有一个明显的问题,或者是否有比我更有知识的人对更好的方法有什么建议?在我看来,这似乎是可行的,但我了解到,在安全问题上,可能会有很多隐藏的陷阱P谢谢

简短回答 任何允许您检测两个用户是否具有相同密码的算法都将允许攻击者检测两个用户是否具有相同密码。这实际上是一种预计算攻击。因此,您的问题无法安全解决

例子
  • 假设我泄露了你的密码数据库
  • 假设我已经计算出了散列的计算方法
如果我可以将您的密码转换算法应用于“password”,并快速告诉哪些用户使用“password”作为他们的密码,那么系统很容易受到某种形式的预计算攻击

如果我必须进行昂贵的计算以确定每个用户的密码,并且计算用户A的密码所花费的工作不会使计算用户B的密码变得更容易,那么系统是安全的(针对这些类型的攻击)

进一步考虑 您使用带有bcrypt和高迭代次数的逐站点salt的想法一开始可能看起来很有吸引力,但它无法扩展。即使是10秒,也就是每分钟猜6次密码,每小时360次,每天8640次,或者每年300万次(这太多了)。那只是一台机器。在这个问题上扔一个僵尸网络机器,或者一些GPU,突然这个数字就达到了顶点。仅300台机器/核心/GPU就可以在一天内完成250万次猜测


因为您将对每个密码使用相同的密码,所以您允许攻击者一次破解您用户的所有密码。通过仅使用每个用户的salt,攻击者一次只能尝试破解单个用户的密码。

以上给出的简短回答假设攻击者在任何时候都具有与服务器相同的访问权限,这可能是不合理的。如果服务器受到永久性破坏(由攻击者所有),则任何方案都无法拯救您-攻击者可以检索用户设置的所有密码。通常情况下,攻击者可以在服务器上线后的某个时间段内访问您的服务器。这为执行您询问的密码匹配提供了机会,而无需提供对攻击者有用的信息

如果在注册或更改密码时,您的服务器可以访问纯文本形式的密码,那么服务器可以迭代系统上的所有用户帐户,将新密码与每个用户的salt进行散列,并测试它们是否相同

这不会带来任何弱点,但只有当防止多个假帐户的算法可以将其用作一次性输入(“此密码与这些帐户匹配”)时,它才会对您有用

将这些信息存储起来供以后分析显然是一个弱点(因为如果攻击者可以获取您的密码数据库,他们可能还可以获取具有相同密码的帐户列表)。一个折衷方案可能是存储信息以供日常审查,从而减少暂时破坏您的存储的攻击者可用的全部有用信息


如果盐析和散列发生在客户端,那么所有这些都是没有意义的-那么服务器无法执行测试。

可能需要尝试征求建议。非常感谢您周到的回复。你解释的方式很直观。我想为了安全起见,我们可能不得不放弃这个功能。我真的很感谢你花时间帮我澄清这件事@伊坦伯斯坦:没问题。这是一个非常有趣的问题。哇,谢谢!你提出了我从未考虑过的几点极好的观点。像大多数优雅的解决方案一样,将新密码与现有密码进行哈希运算并保存匹配数据的想法在回想起来似乎是显而易见的,但我自己从来没有想到过。如果其他人也在为同样的问题而挣扎,我鼓励他们追求这个想法。这似乎是最好的折衷方案。您可以反复访问每个用户的帐户并检查重复的帐户,尽管这取决于占用的CPU(和时钟)时间可能超过预期的用户数。然而,你所说的有两个关键问题。1.虽然攻击者通常只能访问有限的时间段,但下载密码数据库并不需要很长时间。然后他们就可以永远尝试破解。2.盐渍与腐植酸