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

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

通常需要多少次尝试才能暴力破解6个或更多字符的平均密码(没有额外的知识可能会有所帮助,但考虑到密码可能容易出现字典攻击),并据此制定有意义的限制适用于节流算法而不会中断用户体验?

这是我目前的计划:

  • 登录表单使用随机数,因此攻击者必须等待一个完整的请求周期才能完成登录尝试的结果并检索新的令牌。
  • 我允许每次IP检索登录表单50次,每次请求之间少于1分钟,之后IP将被阻止1分钟。 在这一分钟内的任何新的尝试将重新启动超时。
  • 每次# of attempts / 5登录页面都会有一次sleep ,因此在5次请求之后,每次请求之间的时间少于1分钟时,在10次请求> 2秒之后,取出表单需要1秒以上的时间。
  • 此外,我只允许每个用户帐户尝试100次失败的登录尝试,尝试之间有2小时,之后该帐户被阻止2小时。
  • 为了避免频繁拒绝帐号,可将IP列入白名单(不适用限制)或列入黑名单(任何登录尝试完全忽略)。
  • 根据迄今为止的答案,我调整了它的工作方式:

  • 检索登录表单的速度逐渐减慢,以IP为基础。 每个新请求都会# of requests / 2秒。 没有登录活动10分钟后,计数器会重置。
  • 我为每个IP保留一个FIFO堆栈的登录尝试。 如果IP在2小时内未能登录30次,则会暂停。 我还保留了每个IP的暂停数量列表,暂停时间计算为2 ^ (# of suspensions + 1) hours 。 这应该导致事实上将不断冒犯的知识产权列入黑名单。
  • 此外,如果帐户在一天内未能登录20次,则会暂停2小时。 我对此措施还不太确定,因为这意味着账户可以很容易处理。 尽管没有大规模的分布式僵尸网络,但是冒犯IP的实际上应该成为事实上的黑名单,而不是一个永久性的账号。 这也是保护账户的一个非常有效的措施。
  • 我认为这些限制不应伤害普通用户,即使是经常忘记密码并尝试登录多次的用户。 考虑到服务的平均大小,IP限制也应该适用于大量使用NAT的用户。 有人可以用一些坚实的数学证明这是有效的或低效率的吗? :)


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

  • 全部小写:26 ^ 6 = 308,915,776可能的密码=最差情况12年,平均6年
  • 小写字母和数字:36 ^ 6 = 82岁,平均41岁
  • 当然,字典攻击会更快,但我没有这个数字。

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

    EDIT2:

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

  • 所有列出的单词(75,000):〜1天
  • 816个常用密码列表:约16分钟
  • 真的很长的单词列表:〜12天(我看着这个,我猜它包含大多数非技术人员的密码)
  • 最后一个是可怕的,但12天仍然很长时间。 如果你真的担心,你可以跟踪每个不正确的密码,直到用户获得正确的密码,然后如果列表结束了100次不同的尝试,只需禁止IP地址并发送电子邮件给用户。


    你有几个很好的控制,但你真的应该更紧张。 一个普通用户不应该登录超过五次。 如果他这样做,给他看CAPTCHA。

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

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

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

  • 有人未能登录帐户X - 增加失败的尝试字段。
  • 如果有超过5次失败尝试,并且最近一次失败的尝试发生在一小时前,似乎该帐户受到攻击,请显示验证码。
  • 另一方面,如果最后一次失败的尝试发生在一天以前,似乎攻击已经结束,降低了你的盾牌并且不需要验证码。
  • 这基本上是一个盾牌,当针对特定帐户进行大规模针对性攻击时会启动。 这种方法的好处在于,如果我拥有世界各地的个人电脑农场并不重要 - 我不能蛮横强制一个帐户,因为它是基于帐户的。

    这两件坏事情是,如果验证码失败,你什么都没有了。 您当然也可以通过提供其他保护来改善这种情况。 第二个问题是,如果我有一个僵尸网络,我可以为每个帐户使用一台PC,然后可能有一百万台计算机网络我至少破解一个帐户,但这种方法只适用于非针对性攻击。

    我希望这给你一些想法。


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

    除了失败追踪字段之外,还可以添加带有时间戳的锁定字段。 我同意永远锁定用户(或直到手动重置)会导致不好的体验,但将帐户锁定一小时(虽然轻微痛苦)是一种有效的威慑措施。

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

    从管理角度手动锁定帐户然后变成只是将锁定字段设置为诸如9223372036854775807l (最大64位有符号长)的遥远未来值的问题。

    链接地址: http://www.djcxy.com/p/21681.html

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

    下一篇: ASP MVC Single Application Multi