提问人:deceze 提问时间:3/4/2010 最后编辑:deceze 更新时间:11/16/2012 访问量:9314
尝试暴力破解平均密码/非侵入性但有意义的限制的次数?
Number of attempts to brute force an average password / non intrusive yet meaningful limits?
问:
关于防止通过应用限制来暴力破解 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 用户。有人能用一些扎实的数学来证明这是有效的还是低效的?:)
答:
从问题来看,听起来他们可能尝试密码的最快速度是每分钟 50 个。基于此并使用随机的 6 位密码:
当然,字典攻击会快得多,但我没有这方面的数字。
编辑:我试图链接谷歌计算器结果来支持这一点,但似乎在这里搞砸了链接。^
编辑2:
字典攻击(来自 http://www.outpost9.com/files/WordLists.html):
最后一个很可怕,但12天还是很长的时间。如果你真的很担心,你可以跟踪每一个不正确的密码,直到用户得到正确的密码,然后如果列表超过100次不同的尝试,只需禁止IP地址并向用户发送电子邮件。
评论
sleep
你在那里有几个很好的控制,但你真的应该更紧。普通用户登录失败的次数不应超过五次。如果他这样做了,请向他出示验证码。
请记住,在任何情况下都不应锁定帐户。这称为帐户锁定漏洞。这允许任意用户从服务中注销其他用户(DOS,拒绝服务)。
我已经多次处理过这个登录限制问题,我喜欢的是您在数据库中创建一个失败尝试字段和上次失败尝试日期。每当某人(任何人)无法登录帐户 X 时,您都会增加 X 失败尝试的值并更新上次失败尝试日期。如果失败的尝试次数超过 Y(例如,5 次),则显示特定用户的验证码。因此,您不会有一个庞大的被禁止 IP 数据库来限制登录表单,相反,每个用户只需多两个字段。由于僵尸网络和代理(合法和非法)的存在,基于 IP 的禁止/限制也毫无意义。当 IPv6 流行起来时,我想你会更加注定要失败。根据目标帐户进行限制更有意义。因此,当您的帐户 X 成为僵尸网络的目标时,登录表单将受到验证码的限制。这里明显的缺点是,如果您的验证码失败......您的登录限制也是如此。
所以,从本质上讲,它是这样的:
- 有人无法登录帐户 X - 增加失败尝试字段。
- 如果失败的尝试超过 5 次,并且最后一次失败的尝试发生在一小时前,则该帐户似乎受到攻击,请显示验证码。
- 另一方面,如果最后一次失败的尝试发生在一天多前,则攻击似乎已经结束,请降低您的护盾并且不需要验证码。
它基本上是一个盾牌,当对特定帐户进行大规模针对性攻击时会打开。这种方法的好处是,如果我在世界各地拥有 PC 农场并不重要 - 我不能暴力破解单个帐户,因为它是基于帐户的。
这样做的两个坏处是,如果验证码失败,你就一无所有了。当然,您也可以通过放置其他保护措施来改善这种情况。第二个问题是,如果我有一个僵尸网络,我可以为一个帐户使用一台 PC,然后很可能在一百万个计算机网络中,我至少破解了一个帐户,但这种方法仅适用于非针对性攻击。
我希望这能给你一些想法。
评论
Captcha
我通常喜欢 @Tower 的答案,但更喜欢不使用 CAPTCHA 的变体,主要是因为我讨厌它作为用户体验。
除了他的失败跟踪字段外,还添加了一个带有时间戳的锁定字段。我同意永久锁定用户(或直到手动重置)会带来糟糕的体验,但锁定帐户一个小时(虽然有点痛苦)是一种有效的威慑。
然后,更改是,当失败计数超过阈值时,锁定字段将设置为 。每当执行身份验证时,它都会查看此字段,如果 ,则失败。now + 1 hour
lockout > now
然后,从管理角度手动锁定帐户只需将锁定字段设置为某个遥远的未来值,例如(最大 64 位有符号长)。9223372036854775807l
上一个:查找数字范围交点
评论