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

时间:2013-01-15 20:05:23

标签: hash cryptography security bcrypt

在我们的留言板上,我们使用密码匹配来帮助检测具有多个注册的成员,并对恶意傀儡帐户实施我们的规则。当我们有SHA256哈希值和每个站点的盐时,它运行良好。但是我们最近遇到了一个令人羞愧的安全漏洞,其中一些密码哈希陷入字典攻击。因此我们强制更改密码,并切换到bcrypt + per-user salts。

当然,现在密码匹配不再起作用了。我没有正式的密码学或计算机科学教育,所以我想问一下是否有一种安全的方法可以解决这个问题。我工作的人建议使用松散哈希算法的第二个密码字段,故意有很多冲突,但在我看来,这会导致大量的误报,或者为了安全而减少搜索空间太多。我的想法是坚持使用bcrypt,但是存储第二个密码哈希,它使用每站点盐和极高的迭代次数(比如在现代硬件上生成10秒以上)。这样,具有相同密码的用户将具有相同的哈希值,但无法通过字典攻击轻松推断出。

我只是想知道这是否有明显的问题,或者是否有比我更有知识的人有更好的方法来处理事情?在我看来它会起作用,但我已经知道在安全方面可能会有很多隐藏的陷阱。 :P谢谢!

2 个答案:

答案 0 :(得分:1)

简答

任何允许您检测2个用户是否具有相同密码的算法也允许攻击者检测2个用户是否具有相同的密码。这实际上是预先计算攻击。因此,您的问题无法安全解决。

实施例

  • 假设我已经破坏了您的密码数据库。
  • 假设我已经弄清楚你的哈希值是如何计算的。

如果我可以将您的密码转换算法应用于“密码”并快速告知哪些用户使用“密码”作为密码,那么系统很容易受到预先计算攻击的影响。

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

进一步考虑

您最初使用带有bcrypt和高迭代次数的每站点盐的想法似乎很有吸引力,但它无法扩展。即使在10秒钟,也就是每分钟6次密码猜测,每小时360次,每天8640次,或每年3M(这很多)。那只是一台机器。在这个问题或某些GPU上扔掉机器的僵尸网络,突然间,这个数字就会通过屋顶。只需300台机器/核心/ GPU就可以在一天内完成2.5M的猜测。

因为您将为每个使用相同的盐,所以您允许攻击者立即破解所有用户的密码。通过仅使用每用户盐,攻击者可以有效地一次只尝试破解单个用户的密码。

答案 1 :(得分:1)

上面给出的简短答案假设攻击者始终与服务器具有相同的访问权限,这可能是不合理的。如果服务器以永久方式受到攻击(由攻击者拥有),则没有方案可以保存您 - 攻击者可以检索用户设置的所有密码。该模型更常见的是,攻击者能够在有限时间段内访问您的服务器,在其生效后的某个时间点。这提供了一个机会来执行您询问的密码匹配,而不提供对攻击者有用的信息。

如果在注册或密码更改时,您的服务器可以以纯文本格式访问密码,那么服务器可以遍历系统上的所有用户帐户,使用每个用户的单独盐来散列新密码,并进行测试以查看如果它们是相同的。

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

存储该信息以供以后分析显然是一个弱点(如果攻击者可以获取您的密码数据库,他们也可能获得具有相同密码的帐户列表)。中间立场可能是存储信息以供日常审查 - 减少临时危及您存储的攻击者可用的总有用信息。

如果盐析和散列发生在客户端,那么所有这一切都没有用 - 那么服务器就无法进行测试。