如果公司只存储哈希值,他们的密码是如何被盗的?

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

我到处都看到它说服务器以散列形式存储密码,但是你有那些关于黑客从大公司窃取密码的突发新闻。我错过了什么?

4个回答

除了让数据库或文件首先被盗之外,还有两个常见的失败。

不幸的是,违背所有安全建议,许多系统仍然存储纯文本密码。

散列密码在技术上是不可逆的,但正如其他人所指出的那样,可以对数百万个密码猜测进行散列,然后简单地查找匹配项。事实上,通常会发生预先计算的密码和哈希表(彩虹表)可用并用于查找匹配项。一个好的彩虹表可以支持每个密码哈希在几分之一秒内的高百分比匹配。

在散列中使用密码的额外非秘密扩展名)可防止使用预先计算的彩虹表。

大多数妥协者依赖于彩虹表。计算他们自己的哈希集当然是可能的,但它非常耗时(几个月或更长时间),所以通常是普通哈希是易受攻击的。

使用盐会停止彩虹表,并且散列哈希的高轮计数可以使蛮力从数月过渡到数年或更长时间。大多数机构根本不实施这种级别的安全性。

当您听说密码被盗时,有时公司会报告它,即使它只是被盗的散列密码。这样您就可以在它们损坏的情况下采取措施。不幸的是,仍然有一些公司错误地存储了他们的密码。例如,如果您搜索 rockyou 密码泄露,您会发现他们以明文形式存储密码,这意味着密码一旦被盗,就会被泄露。在其他情况下,例如 Adob​​e 密码泄露,将加密密码存储在其数据库中的处理不当。其他时候,公司在他们的密码上使用散列,但使用不安全的散列算法,或者他们没有正确地加盐密码。简而言之,如果一家公司遵循推荐的密码存储方法,理论上,散列形式的密码应该是安全的,但一家好的公司仍会通知其客户违规行为。但是,有很多例子表明公司没有正确存储密码,导致密码很快被破解。

您散列大量潜在密码*,然后检查每个输出是否与被盗密码数据库中的任何散列匹配。蛮力破解是可行的,因为人们通常不会选择高度不可预测的密码。

当密码数据库被盗时,被盗资料包括进行离线破解所需的所有信息。(这只是一个猜测和检查过程。其他方法可能使用不太安全的散列或密码存储方法。)

* 如果使用盐,那么饼干也必须考虑这些。如果每个帐户都使用唯一的盐,那么破解者就不能简单地通过对每个候选密码进行一次散列来针对每个人。如果针对多个帐户,则您要尝试的密码必须针对每个盐进行一次哈希处理。如果密码哈希没有加盐或都使用相同的盐,那么进行无针对性的攻击会容易得多;您只需要对候选密码进行一次哈希处理,即可找出拥有该密码的用户的完整列表。盐还使使用哈希预计算来节省破解工作的尝试变得毫无用处。如果只针对一个帐户,Salts 不会减少需要评估的哈希数。除了这些细微差别之外,密码破解的基础仍然是猜测和检查过程。


具有足够不可预测的输入的具有抗原像功能的哈希密码足以使恢复密码成为不可能。(一个不人道的强密码。)

但是,大多数人在现实世界中不会这样做,被盗的哈希数据库可能与典型网站上大部分用户的未哈希密码列表一样令人担忧。

如果密码破解者发现候选密码的哈希值与存储在数据库中的密码相匹配,那么他将恢复原始(弱)密码。


或者,如果散列函数不抗原像(包括当散列的输出太短时),则猜测和检查过程可能会产生误报。(替代密码与原始密码不同。)

发生数据泄露的公司用户的帐户仍然容易受到攻击,因为这些密码将解锁用户的帐户,即使它们与原始密码不同。(服务器无法判断它是否是原始密码。在这种情况下,哈希仍然与被盗数据库中的哈希匹配。)

当然,不要故意使用不安全的哈希函数......仍然可以推断出原始密码或缩小可能性的数量。这仍然会使在其他网站上重复使用密码的用户更加容易受到攻击。


还有其他方法可以窃取密码,这些方法并非源于密码哈希数据库的副本被泄露。可以记录明文登录信息。(例如,通过观察未加密/解密的网络流量、黑客攻击和重写服务器代码或利用客户端错误。)然后可以窃取该日志。

当然,有些公司可能一开始就没有使用安全密码验证方案,或者可能通过错误1、2泄露明文。

尽管对某些大规模密码泄露事件有其他解释,但从密码哈希中恢复明文密码是常见且有效的。然而,在每个大型数据库泄漏中 100% 的哈希都将被恢复并不是那么有效。

如果密码是用密码散列函数处理的,那么密码非常强的用户就不需要像普通用户那样担心。(但大多数人高估了密码强度和他们自己的聪明才智。)在花费大量资源破解 99% 的哈希之后,破解最后 1% 可能不值得或不切实际。但是,如果密码没有经过哈希处理,那么强密码就不好用了。

开发人员应使用密码拉伸算法。这些算法只是试图使密码散列更加昂贵。(适用于合法用户和密码破解者。)Argon2 是目前最好的密码拉伸算法,尤其是在 Intel/ARM CPU 上。Argon2 特别可以在很大程度上减少会被破解的哈希值。(弱密码仍然可以破解。)

多种可能性:

  1. 尽管密码应该在存储之前进行哈希处理,但情况并非总是如此。可悲的是,即使在今天,仍有大量密码以明文形式存储窃取数据库,获取所有密码。

  2. 密码可以存储在其他地方。例如,密码可以包含在日志中。窃取日志,获取这些日志中使用的所有密码。

  3. 密码可以散列但不能加盐因此,您构建了一个密码列表 -> 基于各种密码的哈希组合。您反转此表,使其变为哈希 -> 密码(查找表)。获取数据库,将哈希转换为密码,获取大量密码。

  4. 密码经过哈希处理和加盐处理。但是很多用户使用非常弱的密码(123456、password、letmein、qwerty...)尝试针对这些哈希的密码列表。获取数据库,对哈希进行字典攻击,获取大量密码。

  5. 前一个的变体,而不是预先确定的密码列表,尝试根据您拥有的有关用户的其他信息(用户名、名字、姓氏、出生日期、电子邮件......)输入密码。

  6. 另一个变体,因为许多用户重复使用相同的密码:尝试从其他违规行为中恢复的相同电子邮件/用户名的密码

  7. 另一种变体,当有一个需要定期更改密码的强密码策略时:如果您有用户以前的密码,只需尝试更改最终数字:如果用户有密码“joe12”,试试 joe13, joe14, joe15... 如果您知道初始密码的有效日期并且知道密码更改间隔,那会很快。

  8. 密码经过散列和加盐处理,但使用弱(快速)散列与 #4-7 相同,但您可以更快地进行更多尝试,因此您可以尝试更大的字典,甚至可以非常系统地尝试所有组合(蛮力攻击)。

  9. 客户端和服务器之间的通信容易受到中间人(MITM) 攻击。密码在途中被捕获。

  10. 你执行社会工程“您好,这里是 IT 部门,您的帐户有问题,我们需要重新设置一些东西,您能给我您的密码吗?” 如果正确构图,您会惊讶于它的工作频率。

  11. 大规模社会工程,又名网络钓鱼:发送大量电子邮件活动,要求登录一个网站,该网站将捕获所有这些密码。

  12. 入侵该站点并对其进行修改,以便它将收到的所有密码发送到远程服务器(或将它们记录到您稍后将检索的文件中)。

  13. 同上,但修改客户端代码来做到这一点。可以像存储的 XSS黑客一样简单。

  14. 上面的一个变体:键盘记录器

可能还有很多方法,但这让您了解恢复大量密码是多么容易。