我该如何实现一个阻止密码破解的系统?

时间:2012-05-26 04:19:27

标签: security

我想采取措施阻止人们试图破解我网站上的用户帐户。这背后的最佳流程是什么,而不会让只需要记住几个密码的客户讨厌?

我注意到Google在几次尝试失败后显示了验证码图像。我从来没有努力过,但我确信他们必须在经过几次尝试后阻止你。

最好的做法是确保某人不会尝试使用强力方法来获取帐户?

验证码? 阻止他们的IP地址(如果它们在共享IP上,这是否有效)?

2 个答案:

答案 0 :(得分:1)

你最好的选择是在每个用户名的基础上锁定(10分钟,15分钟等),并在一段时间内进行相对较多的尝试(10或20左右)(例如滚动30分钟窗口) )。通过设置高于3或5的尝试次数,普通用户将在锁定命中之前放弃或尝试重置密码。

您可以考虑记录失败的尝试数据(IP,用户名,时间戳,...),以了解正常用户行为和暴力尝试之间的行为差​​异。这样您就可以随时修改政策。

还要考虑强密码政策(至少8个字符且至少有一个号码)。

您也可以考虑使用某种形式的多重身份验证。您提到了验证码,但您可能会发现许多其他技术很有用。我使用的一个站点会将令牌通过电子邮件发送给用户的电子邮件地址,如果他们无法识别用户的IP地址,并且用户必须先提供该令牌才能从新的IP地址访问。

答案 1 :(得分:1)

在一定次数的尝试之后锁定用户和/或延长再次登录尝试后所花费的时间的方案再次被接受当然是个好主意。和CAPTCHA一样(除了讨厌:) 但是,在我看来,只有你有强大的硬件支持才有意义。

我认为只有在你有资源的情况下才应该尝试这样做的原因是你必须记住,这样的计划要求你记住最近的尝试可能系统中的每个用户。当然,有许多方法可以持久保存信息,其效果各不相同:内存缓存,数据库等。

但无论如何,这样的机制会给你的应用程序带来额外的负担,而且还有一个缺点:如果攻击者对你的应用程序感到厌倦或厌烦,他们也可能试图通过拒绝服务攻击来降低它。需要持久保存大量信息的复杂登录方案将有助于实现这一目标。

如果您决定应用这样的功能,我建议您先在实验室中对它进行压力测试,以了解“您可以承受多少” - 这样您就可以了解是否需要升级你的硬件:)

在不需要持久性的情况下,更简单的方法是应用密码哈希,如PBKDF2,bcrypt或scrypt。这些人工缓慢的攻击者足以让他们尽可能地努力。但要注意的是,这些也会给你的应用带来额外的计算压力(尽管可能比前面提到的要小),所以我再次做一些压力测试。