8

关于通过应用限制来防止暴力破解 Web 服务密码的 SO 上有几个有用的答案。我找不到任何好的数字,而且我在这方面的专业知识很少,所以问题是:

暴力破解平均 6 个或更多字符的密码通常需要多少次尝试(没有可能有帮助的额外知识,但考虑到密码可能容易受到字典攻击)以及基于此,什么是有意义的限制在不破坏用户体验的情况下应用于节流算法?

这是我目前的方案:

  • 登录表单使用随机数,因此攻击者必须等待一个完整的请求周期完成才能获得登录尝试的结果并检索新令牌。
  • 我允许每个 IP 检索登录表单 50 次,请求之间间隔不到一分钟,之后 IP 将被阻止 1 分钟。这一分钟内的任何新尝试都将重新开始超时。
  • sleep每次获取登录页面都有一个应用程序# of attempts / 5,因此在请求之间不到一分钟的 5 次请求之后,获取表单需要 > 1 秒,在 10 次请求 > 2 秒后,等等。
  • 此外,我只允许每个用户帐户 100 次失败的登录尝试,每次尝试间隔 2 小时,之后该帐户被阻止 2 小时。
  • 为了避免频繁的 DoS 帐户攻击,IP 可以被列入白名单(没有限制)或列入黑名单(完全忽略任何登录尝试)。

根据到目前为止的答案,我对其进行了调整,使其工作如下:

  • 在每个 IP 的基础上,检索登录表单的速度会逐渐减慢。每个新请求都会休眠# of requests / 2几秒钟。没有登录活动 10 分钟后,计数器会重置。
  • 我为每个 IP 保留了一个 FIFO 堆栈的登录尝试。如果一个IP在2小时内登录30次失败,它就会被挂起。我还保留了每个 IP 的暂停次数列表,暂停时间计算为2 ^ (# of suspensions + 1) hours. 这应该会导致将持续违规的 IP 快速列入事实上的黑名单。
  • 此外,如果一个帐户在一天内无法登录 20 次,则会被暂停 2 小时。我还不太确定这项措施,因为这意味着帐户可以很容易地被 DoS 攻击。但是,如果没有大规模的分布式僵尸网络,违规的 IP 应该会比帐户被永久 DoS 更快地列入事实上的黑名单。这也是保护帐户的一种非常有效的措施。

我认为这些限制不应该伤害普通用户,即使是那些经常忘记密码并尝试多次登录的用户。考虑到服务的平均规模,IP 限制也应该适用于经过大量 NAT 的用户。有人可以用一些扎实的数学证明这是有效的还是无效的?:)

4

3 回答 3

6

你有几个很好的控制,但你真的应该更加收紧它。普通用户不应登录超过五次。如果他这样做了,请给他看一个验证码。

请记住,在任何情况下都不应锁定帐户。它被称为帐户锁定漏洞。这允许任意用户从服务中注销其他用户(DOS,拒绝服务)。

我已经多次处理过这个登录限制问题,我喜欢的一个是您在数据库中创建一个失败尝试字段和最后一次失败尝试日期。每当某人(任何人)未能登录帐户 X 时,您会增加 X 的失败尝试值并更新上次失败尝试的日期。如果失败尝试次数超过 Y(例如,五次),则显示特定用户的验证码。因此,您不会有一个庞大的禁止 IP 数据库来限制登录表单,而是每个用户只有两个字段。由于僵尸网络和代理(合法和非法的),基于 IP 禁止/限制也没有什么意义。当 IPv6 流行起来时,我想你会更加失败。根据目标帐户进行节流更有意义。所以,当您的帐户 X 成为僵尸网络的目标时,登录表单将受到验证码的限制。这里明显的缺点是,如果您的验证码失败......您的登录限制也会失败。

所以,本质上它是这样的:

  • 有人未能登录帐户 X - 增加失败尝试字段。
  • 如果尝试失败超过 5 次,并且最后一次失败尝试发生在 1 小时前,则该帐户似乎受到攻击,请显示验证码。
  • 另一方面,如果最后一次失败的尝试发生在一天多之前,则攻击似乎已经结束,降低你的盾牌并且不需要验证码。

它基本上是一个盾牌,当对特定帐户进行大规模有针对性的攻击时会打开。这种方法的好处是,如果我在世界各地拥有一个 PC 农场,这无关紧要——我不能暴力破解单个帐户,因为它是基于帐户的。

这有两个不好的地方是,如果验证码失败,您将一无所有。当然,您也可以通过设置其他保护措施来改善这种情况。第二个问题是,如果我有一个僵尸网络,我可以每个帐户使用一台 PC,然后很可能在拥有一百万个计算机网络的情况下我至少破解一个帐户,但这种方法仅适用于非目标攻击。

我希望这能给你一些想法。

于 2010-03-04T10:28:48.817 回答
3

从这个问题来看,他们可能尝试密码的最快速度是每分钟 50 个。基于此并使用随机 6 位密码:

当然,字典攻击会快得多,但我没有数字。

编辑:我试图链接支持这个的谷歌计算器结果,但^似乎在这里搞乱了链接。

编辑2:

字典攻击(来自http://www.outpost9.com/files/WordLists.html):

  • 所有列出的单词(75,000):~1 天
  • 816 个常用密码列表:~16 分钟
  • 非常长的单词列表:~12 天(我看了这个,我猜它包含大多数非技术人员的密码)

最后一个很吓人,不过12天还是很长的。如果您真的很担心,您可以跟踪每个错误的密码,直到用户获得正确的密码,然后如果列表超过 100 次不同的尝试,只需禁止 IP 地址并向用户发送电子邮件。

于 2010-03-04T04:43:10.337 回答
0

我通常喜欢@Tower 的回答,但更喜欢不使用 CAPTCHA 的变体,主要是因为我讨厌它作为用户体验。

除了他的失败跟踪字段外,还添加了一个带有时间戳的锁定字段。我同意永远锁定用户(或直到手动重置)会带来糟糕的体验,但锁定一个小时(虽然有点痛苦)是一种有效的威慑

然后更改将是,当失败计数增加超过阈值时,锁定字段设置为now + 1 hour。每当执行 auth 时,它都会查看此字段,如果lockout > now,则失败。

然后,从管理的角度手动锁定帐户只需将锁定字段设置为某个遥远的未来值,例如9223372036854775807l(最大 64 位有符号长)。

于 2012-11-15T21:53:45.667 回答