我们的密码怎么会这么容易被破解?

信息安全 密码 哈希 sql注入 密码破解
2021-09-02 08:18:43

我们正在使用 PHP 将密码保存在数据库中:

return hash('sha256', PASSWORD_SALT . $password);

最近(幸运的是)一位优秀的黑客向我们注入了 SQL,并破解了一些密码,包括管理员密码。

这个故事并没有像好莱坞电影中那样戏剧性或可怕地结束,因为他很友善地指出了漏洞。(我们相应地“感谢”了他。)

现在漏洞已经被修补,我们担心其他地方可能会有一些漏洞,因为代码库很大。问题是:

  • 他到底是如何这么快(几小时到一天)破解密码的?PASSWORD_SALT 很长,存储在源代码中,他没有。此外,PHP 代码中不接受空白密码。
  • 我们假设我们应该更改现有和未来密码的哈希/加密。您推荐哪种加密方式以使暴露的密码更安全?

他告诉我们,他在他的公司使用了一些软件和十几台台式机。他说他是某大公司的无聊安全专家,所以他有办法做事。

3个回答

首先,你所说PASSWORD_SALT的并不是真正的盐。每个密码的盐值都不同,并存储在数据库中。您所拥有的是所有密码共享的东西,并存储在源代码中。这就是通常所说的辣椒。

那么攻击者是如何在不知情的情况下如此快速地破解您的密码的呢?他可能为自己创建了一个新用户,因此他有一个知道密码的用户。然后他可以尝试对那个用户进行暴力破解,因为他知道他应该将它连接到哪个密码。这里的关键是他不必同时破解辣椒和密码。他可以先破解辣椒,再破解密码。这要简单得多。

SHA-256 的单次迭代不是一个好的密码散列算法。这是快速的方法。根据8x Nvidia GTX 1080 设置的这些基准,您每秒可以尝试大约 20 亿次哈希。如果我们给攻击者 12 小时,那几乎是 10 14 个哈希值。平均而言,这足以用 log 2 (10 14 ) - 1 = 45 位熵来破解辣椒。例如,这对应于 10 个随机小写字母。

一旦你有了辣椒,你就可以开始破解密码了。因为它们的熵可能比辣椒低,所以应该快得多。

有关如何正确进行密码散列,请参阅此问题

他到底是怎么破解密码的这么快(几个小时到不到一天),PASSWORD_SALT 很长,存储在源代码中而他没有。此外,php 代码中不接受空白密码

好吧,我确信他使用了一台或多台内置 GPU 的计算机。也许他在 CLI 模式下运行多个 GPU。这意味着,像 GTX1080 这样的多个 GPU 可以为一个操作完成相同的任务。在这种情况下,从密码列表中散列 SHA256 中的字符串,并将其与他在您的数据库中找到的散列密码字符串进行比较。

举个例子,GTX1070 可以在一秒钟内散列和比较多少个密码,我将把你推荐给我找到的这个博客:https ://hashcat.net/forum/thread-5440-post-31067.html

在此示例中,测试人员Windows 7系统上使用了EVGA GeForce GTX 1070 SC GAMING ACX 3.0 。GPU 成功地“破解”了 SHA256 算法的 2117.4 MH/s。

然后他尝试破解至少几个密码,将它们相互比较,以及在哪里能够确定盐分。了解盐的外观后,他创建了一个新的密码列表。从盐开始,然后是他的正常密码列表。


我们假设我们应该更改现有和未来密码的哈希/加密。您推荐哪种加密方式以使暴露的密码更安全?

当黑客能够获得散列密码时,取决于散列算法需要多长时间才能解密大部分密码,这只是时间问题。我不想推荐一个算法,因为它很大程度上取决于你的计算能力和加载时间。但是,如果您想了解哪种算法比 SHA256 更强,请查看密码破解基准:https ://gist.github.com/epixoip/a83d38f412b4737e99bbef804a270c40

更强大的密码策略,另一种延迟破解过程或使黑客无法猜出正确密码的方法。

我怀疑你对情况的描述是否准确可靠。特别是我发现很难相信这一点:

PASSWORD_SALT 很长,存储在源代码中,他没有。

我将此解读为声称 PASSWORD_SALT 是秘密的,攻击者不可能在任何实际时间内猜测(从技术角度来说,它具有高熵)。但是,如果我们同意这一说法,我们将不得不得出结论,攻击者击败了SHA-256 的原像抗性——即,只给散列函数的有效随机输出值,他们能够找到产生该输出的输入. 而不仅仅是任何一个这样的输入——一个恰好以你所谓的秘密、长且不可预测的 PASSWORD_SALT 为前缀的输入。

但当然,您的黑客实际上并没有发现 SHA-256 中的灾难性中断。所以我认为你对情况的理解一定是不准确的。任何一个:

  1. 黑客实际上设法看到了您的代码并了解了 PASSWORD_SALT 的值;
  2. 通过应用通常用于密码破解的相同方法,您的 PASSWORD_SALT 值实际上很容易猜到。安德斯的回答建议攻击者可能已经使用已知密码创建了一个帐户,这是一种可行的方法——在知道密码的情况下破解低熵盐与在知道密码的情况下破解低熵密码相同的问题盐。

我们假设我们应该更改现有和未来密码的哈希/加密。您推荐哪种加密方式以使暴露的密码更安全?

如果您使用 PHP,最新版本具有出色的内置密码存储功能