尝试暴力破解平均密码/非侵入性但有意义的限制的次数?

Number of attempts to brute force an average password / non intrusive yet meaningful limits?

提问人:deceze 提问时间:3/4/2010 最后编辑:deceze 更新时间:11/16/2012 访问量:9314

问:

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

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

这是我目前的方案:

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

根据到目前为止的答案,我将其调整为如下工作:

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

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

算法 安全 语言 - 与语言无关

评论


答:

3赞 Brendan Long 3/4/2010 #1

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

  • 全部小写:26^6 = 308,915,776 个可能的密码 = 最坏情况 12 年,平均 6 年
  • 小写字母和数字:36^6 = 最多 82 年,平均 41 年

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

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

编辑2:

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

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

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

评论

0赞 deceze 3/4/2010
考虑到每个帐户的尝试次数和额外限制,我认为最快的速度实际上会慢得多。所以它看起来足够好?sleep
0赞 Brendan Long 3/4/2010
我就是这么想的。当忽略所有安全功能时,为什么还要更准确,除了一个仍然会导致平均时间为 6 年?不过,字典攻击需要多长时间可能会很有趣。
0赞 BlackICE 3/4/2010
另一个因素是,如果您强制执行除 6 个或更多字符以外的任何类型的复杂性,这将影响任何暴力攻击的有效性。另外,我们是否假设他们已经拥有有效的登录ID?
0赞 Brendan Long 3/4/2010
我的号码假设他们有一个有效的登录 ID。在随机密码测试中,我没有计算超过 6 位数字,因为数字呈指数级增长(即使是随机的小写 6 位密码也几乎牢不可破,而 7 位密码的难度要高出 26 倍)。
0赞 deceze 3/4/2010
感谢您的更新。这些数字看起来确实有点可怕。我认为简单地将尝试次数为 x 次失败的 IP 列入黑名单对于大量 NAT 用户来说会很棘手。这就是每个帐户应该进行 100 次尝试的地方,甚至需要至少 16 个小时才能浏览 ~800 个最常见密码的列表。如果 IP 在某个(更长)的时间范围内两次触发此限制,则自动将其列入黑名单可能是一个好主意?
6赞 Tower 3/4/2010 #2

你在那里有几个很好的控制,但你真的应该更紧。普通用户登录失败的次数不应超过五次。如果他这样做了,请向他出示验证码。

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

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

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

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

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

这样做的两个坏处是,如果验证码失败,你就一无所有了。当然,您也可以通过放置其他保护措施来改善这种情况。第二个问题是,如果我有一个僵尸网络,我可以为一个帐户使用一台 PC,然后很可能在一百万个计算机网络中,我至少破解了一个帐户,但这种方法仅适用于非针对性攻击。

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

评论

0赞 deceze 3/4/2010
这确实是个好建议,暂停帐户是一个相当混乱的措施,尽管有效。:)我想知道是否有比验证码更好的东西。
0赞 Matthieu M. 3/5/2010
我们也在类似的场景中使用了:很少有第一次尝试是免费的,然后显示验证码。ReCaptcha 似乎运行良好(他们也提供音频,尽管是英文的)。Captcha
0赞 mckamey 11/16/2012 #3

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

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

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

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