暴力破解平均密码/非侵入性但意义有限的尝试次数?
在SO上有几个有用的答案,关于通过应用节流来防止暴力破解Web服务的密码。 我找不到任何好的数字,而且我在这方面的专业知识很少,所以问题是:
通常需要多少次尝试才能暴力破解6个或更多字符的平均密码(没有额外的知识可能会有所帮助,但考虑到密码可能容易出现字典攻击),并据此制定有意义的限制适用于节流算法而不会中断用户体验?
这是我目前的计划:
# of attempts / 5
登录页面都会有一次sleep
,因此在5次请求之后,每次请求之间的时间少于1分钟时,在10次请求> 2秒之后,取出表单需要1秒以上的时间。 根据迄今为止的答案,我调整了它的工作方式:
# of requests / 2
秒。 没有登录活动10分钟后,计数器会重置。 2 ^ (# of suspensions + 1) hours
。 这应该导致事实上将不断冒犯的知识产权列入黑名单。 我认为这些限制不应伤害普通用户,即使是经常忘记密码并尝试登录多次的用户。 考虑到服务的平均大小,IP限制也应该适用于大量使用NAT的用户。 有人可以用一些坚实的数学证明这是有效的或低效率的吗? :)
从这个问题,听起来像他们可能尝试密码的速度最快是每分钟50个。 基于此并使用随机6位密码:
当然,字典攻击会更快,但我没有这个数字。
编辑:我试图链接谷歌计算器的结果支持这一点,但^
似乎弄乱了这里的链接。
EDIT2:
字典攻击(来自http://www.outpost9.com/files/WordLists.html):
最后一个是可怕的,但12天仍然很长时间。 如果你真的担心,你可以跟踪每个不正确的密码,直到用户获得正确的密码,然后如果列表结束了100次不同的尝试,只需禁止IP地址并发送电子邮件给用户。
你有几个很好的控制,但你真的应该更紧张。 一个普通用户不应该登录超过五次。 如果他这样做,给他看CAPTCHA。
请记住,在任何情况下都不应锁定帐户。 这被称为帐户锁定漏洞。 这允许任意用户从服务中注销其他用户(DOS,拒绝服务)。
我已经解决了登录限制多次的问题,我喜欢的就是您创建了一个失败尝试的字段,并在数据库中创建了最后一次失败的尝试日期。 每当有人(任何人)未能登录帐户X时,就会增加X失败尝试的值并更新上次失败的尝试日期。 如果失败的尝试次数超过Y(例如五次),则显示特定用户的验证码。 所以,你不会有一个庞大的禁止IP数据库来限制登录表单,相反,每个用户只有两个字段。 由于僵尸网络和代理(包括合法和非法的),禁止/基于IP进行限制也是没有意义的。 当IPv6以流行的方式出现时,你会更注定我的设想。 根据目标客户进行节流更有意义。 因此,当您的帐户X被僵尸网络作为目标时,登录表单将被CAPTCHA限制。 这个明显的缺点是,如果你的验证码失败了......你的登录限制也是如此。
所以,本质上它是这样的:
这基本上是一个盾牌,当针对特定帐户进行大规模针对性攻击时会启动。 这种方法的好处在于,如果我拥有世界各地的个人电脑农场并不重要 - 我不能蛮横强制一个帐户,因为它是基于帐户的。
这两件坏事情是,如果验证码失败,你什么都没有了。 您当然也可以通过提供其他保护来改善这种情况。 第二个问题是,如果我有一个僵尸网络,我可以为每个帐户使用一台PC,然后可能有一百万台计算机网络我至少破解一个帐户,但这种方法只适用于非针对性攻击。
我希望这给你一些想法。
我一般喜欢@ Tower的答案,但更喜欢不使用CAPTCHA的变体,主要是因为我讨厌它作为用户体验。
除了失败追踪字段之外,还可以添加带有时间戳的锁定字段。 我同意永远锁定用户(或直到手动重置)会导致不好的体验,但将帐户锁定一小时(虽然轻微痛苦)是一种有效的威慑措施。
然后,更改将是当失败计数增加超过阈值时,锁定字段将设置为now + 1 hour
。 无论何时执行auth,它都会查看该字段,如果lockout > now
则失败。
从管理角度手动锁定帐户然后变成只是将锁定字段设置为诸如9223372036854775807l
(最大64位有符号长)的遥远未来值的问题。
上一篇: Number of attempts to brute force an average password / non intrusive yet meaningful limits?