防止暴力登录尝试

Preventing brute-force login attempts

我想防止黑客侵入我的用户帐户。人们常说:

The best approach it to lockout an account temporarily after x failed login attempts.

我明白这一点,这似乎是个好主意。例如,使用 IP 是一个非常糟糕的主意 - 至少有一个国家在亚洲进行了 NAT,因此 IP 不能用于任何用途。

不幸的是,锁定确实存在问题。它显示帐户是否存在的信息。我们不想这样做,这就是为什么我们总是写 "email and password do not match" 或类似的东西。

我无法锁定不存在的帐户 - 否则我将不得不存储有关登录尝试失败的不存在帐户的信息。僵尸网络可能会在我的数据库中产生数十亿条记录 - 不存在的帐户。

处理这个问题的可能性有哪些?防止暴力破解同时不泄露账号是否存在的信息?

两点:

锁定帐户没有任何意义;这仅意味着即使是正确的身份验证器也无法登录。你不回复 "OK, that was the right password but your account is locked," 你继续回复 "Incorrect name/password combination" 和以前一样。拥有真实身份验证器的真实用户要么等待十分钟进行重置,要么致电帮助台进行手动重置。暴力破解者会继续尝试其他密码。

假设远程攻击,在三个(或五个,或任何您认为合适的)不成功的 name/password 组合后,断开连接。那就是帐户是否存在,密码是否正确(并且帐户已锁定)或不正确。同样,对攻击者来说没有有用的信息,对健忘或容易输入错误的授权用户造成轻微的不便(重新连接)。

我的团队刚刚解决了这个完全相同的问题,考虑到我们的解决方案最终非常简单,实现这一目标还有很长的路要走。

这里需要考虑的因素太多,您已经涵盖了其中的大部分。对我们来说幸运的是,所有 DDoS/DoS 的东西都由我们的 IaaS 提供商处理,所以我们不必担心任何这些。我的第一个建议是,如果您不使用此类服务​​,我建议您使用,正确实施这些服务并非易事。

在为我们处理所有基础架构后,这使我们能够专注于应用程序本身。我们的第一直觉是考虑锁定方法,然而,经过一些讨论,甚至只是简单地了解了它的工作原理、实施等。我们发现其中有很多潜在的陷阱(你提到的 IP 是一个)我们决定放弃它。

然后我们问了这个问题“我们到底想在这里做什么?”,最终我们想防止机器人和黑客的暴力攻击,但在同时为真正的用户保持良好的用户体验......当一分钱掉下来时,我们实际上无法相信它有多么简单 - 使用 Captcha.

实现非常简单,在 X 次尝试失败后,我们向表单添加一个验证码,并强制用户验证这一点以及他们的凭据。我们认为这让我们在安全性和可用性之间取得了最佳平衡,因为:

  • 我们不会通过将真正的用户拒之门外并让他们等待更长的时间来访问我们的服务来进一步挫败他们
  • 我们很可能会阻止 多数 automated/bot 暴力尝试,例如字典攻击。
  • 我们通过限制登录请求进一步降低了 DoS 的机会
  • 我们将恶意用户的速度减慢到他们认为“真的值得花时间吗?