为什么无法自动检测和阻止暴力破解密码攻击?

信息安全 密码
2021-08-31 21:38:02

为什么软件不能自动检测密码破解攻击并阻止它们?


长版:

假设有人尝试对某个需要密码验证的程序 XYZ 进行暴力破解密码攻击。

我的理解是,这样的攻击将包括迭代“所有可能的密码”集,依次将每个密码提供给 XYZ,直到其中一个有效。为了使这种策略有任何成功的可能性,攻击者必须能够每秒向 XYZ 提供非常多的候选密码。因此,对 XYZ 进行编程以检测这种模式(也就是说,将其与合法用户几次错误输入正确密码的情况区分开来)并在接下来的 10 分钟内自动升级身份验证要求将是微不足道的。

这个想法是允许 XYZ 的所有者设置两个“密码”:一个“1 级密码”(又名“密码),它相对容易记住和容易输入,但也相对容易被破解暴力破解,以及一个“2级密码”(又名“密码短语”),它可能非常长,无法通过暴力破解,而且对于(合法的)日常使用也很不方便。

知道方便但弱密码的几乎不需要使用不可破解但不方便的密码短语

我确信这个方案存在一些巨大的缺陷,否则密码不会让合法用户感到头疼。解释是什么?

4个回答

他们经常这样做。如果您进行过多的在线攻击(或合法的不正确尝试)来访问该帐户,任何合理的系统都会将您拒之门外。

问题来自离线攻击。服务器(或您正在验证的任何东西)必须有一些东西来比较密码。这通常是可以使用密码或哈希解密的加密值。如果此值被泄露,例如当攻击者获得对用户数据库的访问权限时,他们可以尝试在自己的计算机上运行散列或解密,并绕过所有尝试次数的计数。他们还可以尝试更快地猜测数量级,因为他们在本地工作并且不必等待网络。

使用离线攻击,每秒可以尝试数千甚至数百万次攻击,并且在几分钟甚至几秒钟内攻击简单密码突然变得微不足道。由于我们无法控制用于检查密码的系统,因此无法阻止攻击。这就是为什么在发现数据库泄露后更改密码很重要的原因。

对于“在线攻击”,他们在不同程度上确实做到了,并且取得了不同程度的成功。通常,这只是对合法用户的烦恼,而不是对犯罪分子的巨大威慑。
对于离线攻击,这是不可能的。如果有人拥有您的密码数据库,您无法阻止他们使用它(尽管您可以稍微延迟他们)。

手机以您描述的确切方式运行。在错误地输入您的 PIN 码超过某个阈值(例如 3 次尝试)后,您需要 PUK 来解锁设备。如果这种情况发生在我身上,我会非常生气,因为我扔掉了写有 10 位数字的那张纸。

我的 AVM 路由器会将您锁定 5 秒,每次登录失败的时间都会加倍。因此,在 10 次尝试失败后,您需要等待 42 分钟才能重试。

然而,这样的方案仅具有中等程度的智能。虽然您不太可能连续 10 次输入错误,但您完全有可能不记得 10 个密码中的哪一个(您在各种地方很少使用的密码,或者您拥有的密码)随着时间的推移而改变)是正确的。此外,它允许以相对较少的工作进行拒绝服务攻击。
当然,攻击者也必须在两次登录尝试之间等待,但他只等待 21 分钟,而你将不得不等待 42 分钟(或 6 小时而你等待 12 分钟)。另外,如果有人只是恶意,等待也无妨,您可以随时将闹钟设置为 6 小时,晚上再进行一次虚假登录。对于合法用户来说,如果成功的话,这将是一整天的等待(更重要的是,如果您确实需要做某事,等待确实会受到伤害)。
我在某些网站上看到的其他系统甚至更不智能。在一个案例中,几年前,我被迫更改密码以解锁我的帐户,因为有人进行了几次虚假登录。当然,这完全是胡说八道,因为密码显然不是被入侵(因为这些登录尝试不成功)。这种“安全”措施对客户来说只是一个非常大的烦恼,没有任何好处。

在实施者的辩护中,(如果可能的话)想出更好的东西一点也不容易。

还有另一种情况很难检测到。

首先让我们看看容易防御的场景;

简单:防御对单个用户的暴力攻击。

如果单个用户是攻击的目标,蛮力攻击也很容易防御。我们可以锁定该用户的帐户。这可能会惹恼用户,但它可以让我们防止系统受到损害。

  • 登录 UserJoe
  • 登录 UserJoe
  • 登录 UserJoe
  • 登录 UserJoe
  • 登录 UserJoe
  • 锁定 UserJoe 的帐户

简单:防御来自单个 IP 地址的暴力攻击

如果所有请求都来自同一个 IP 地址,则易于检测和防御的蛮力攻击。

我们可以禁止该 IP 地址发出更多请求。

  • SomeIPAddress1 尝试登录
  • SomeIPAddress1 尝试登录
  • SomeIPAddress1 尝试登录
  • SomeIPAddress1 尝试登录
  • 防止 SomeIPAddress1 尝试将来登录

不可能(?):防御僵尸网络暴力破解新用户的每次尝试。

假设有人使用僵尸网络试图暴力破解您的系统。它们将具有不同的 IP 地址,因此您无法按 IP 地址过滤登录。

接下来假设他们每次尝试登录到不同的用户。

所以请求可能如下所示:

  • SomeIPAddress1 尝试登录 UserJoe
  • SomeIPAddress2 尝试登录 UserAnne
  • SomeIPAddress3 尝试登录 UserMarc
  • SomeIPAddress4 尝试登录 UserHanah
  • ...

我想不出任何方法来区分合法登录和虚假登录。

在错误的登录尝试后让某人等待多少时间始终是一种平衡行为。在每次尝试后继续增加等待时间(并最终锁定进一步的尝试直到某种重置)并不是不合理的,但这需要与尝试正在进行的 IP 地址相关联,以便合法用户不会也不会被锁定(因为有人试图闯入他们的帐户而受害)。但是,分布式攻击(来自许多 IP 地址)可以使系统负载下降到它只是成为普通 DDoS 攻击的程度。

如果某人决心尝试一大堆密码(不一定是所有可能的密码,只是最常见/可能的密码)并且有一群僵尸机器来做,那么他们最终会成功,或者将系统带到它的膝盖。不要忘记强制等待时间(拒绝登录请求)或拒绝 IP 地址也会占用资源。而且,如果您有太多密码以至于不记得要使用哪个密码,那么如果您必须遍历所有密码,那么您的方法就有问题!

在如此多的失败尝试之后可能会出现“安全问题”挑战(基本上是备用密码),就像将一次性密码(重置)邮寄到注册的电子邮件地址(无论是自动还是“忘记密码”请求)一样锁定此 IP 地址一段给定的时间或直到要求管理员解锁它。我见过所有这些方法的使用。

如果攻击者有内部信息,即散列或加密的密码文件,他们可以离线完成大部分工作,只需登录一次(在他们弄清楚要使用的密码之后)。密码应始终存储为散列(单向加密),而不是纯文本甚至可逆加密形式。哈希很难(但并非不可能)从中恢复纯文本密码,特别是如果它们被加盐(因此对于碰巧为密码选择“秘密”的两个不同用户来说,哈希是不一样的)。