关于通过应用限制来防止暴力破解 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 的用户。有人可以用一些扎实的数学证明这是有效的还是无效的?:)