在asp.net中暴力攻击失败安全登录

时间:2010-08-19 18:47:43

标签: asp.net security iis-7 brute-force

我刚读了一篇文章说7个字符的密码不再安全。但是,如果服务器在每次登录尝试后增加重试登录尝试的时间,那么暴力攻击就没用了。你如何在asp.net中创建这样的逻辑?不知怎的,我猜服务器端代码需要记住试图登录的ip-address,并且每次尝试都会增加响应时间?

4 个答案:

答案 0 :(得分:4)

IP地址实际上并不是识别用户的安全方法。您可以尝试存储上次在cookie中提交登录尝试的时间,但如果浏览器不接受它们,则它的使用将受到限制。会话变量也需要cookie,因此它们已经出局了。

有些网站(雅虎想到)在第三次尝试后开始显示Captcha表格。除了登录详细信息之外,您还必须正确回答验证码。

另一个选择是在X尝试失败后禁用一个帐户(可以在你的数据库中跟踪),但我个人不喜欢这个,因为它往往会迫使我打电话给别人,以便在我忘记密码时重置密码。< / p>

答案 1 :(得分:2)

许多强力攻击都是脱机进行的。这就是为什么失败尝试锁定不能替代需要复杂的密码,使用适当的“盐”和密钥加强。

答案 2 :(得分:2)

ASP.NET有一个内置机制来防止对登录密码的暴力攻击。 请参阅maxInvalidPasswordAttempts Membership property

恕我直言7字符密码完全适用于大多数Web应用程序(我的银行允许使用7个字符密码),只要遵循安全最佳做法,例如安全散列密码和阻止暴力攻击。

一旦你超过7或8个字符的密码,你真的说“我的应用程序需要超级安全”,在这种情况下你应该考虑个人客户端SSL证书。在密码中需要更多字符会使收益递减。有多少用户可以记住复杂的8或9个字符的密码?他们最终写下来了。就个人而言,我被任何要求我创建一些超级复杂密码的网站拒之门外。

ASP.NET Membership可以为您完成大部分安全工作,只要它设置正确。

但是,ASP.NET成员资格无法为您做些事情,例如:

  • 确保使用HTTPS
  • 防止CSRF和类似攻击
  • 确保将所有Web请求路由到ASP.NET,以防止IIS提供静态内容并绕过ASP.NET身份验证
  • 检查用户是否为人(CAPTCHA)

有关安全最佳做法的更多信息,请查看OWASP

答案 3 :(得分:1)

您可能需要担心至少有三次攻击:

  • 针对特定用户的针对性攻击。您希望为攻击者提供更难记录,但不会太困难。 CAPTCHA就足够了(但是如果用户没有在登录页面上显示,则不要再次输入密码。)
  • 对许多用户进行大规模攻击。锁定单个用户是没有意义的,因为攻击者可以尝试(比方说)3个密码,然后转到另一个帐户。每个IP的CAPTCHA可能就足够了,但您可能还希望对每个IP进行速率限制(或者对于白名单代理列表,使用X-Forwarded-For)。这取决于攻击者僵尸网络的大小;足够大的僵尸网络可以在多个机器人/站点上分发攻击,使每个站点从每个IP获得较低的速率。
  • 对密码数据库的脱机攻击。在这种情况下,即使有良好的散列,你也需要至少大约50位的熵(NTLM使用单个MD4调用,一个好的散列),这是你不能相对的正常的8个字符的密码(8 log 2 (94)仅为52.4)。

您可以将每个IP的尝试存储到树中,在树中将树的密集部分组合在一起。然后把它捣蛋(每隔10分钟建一棵新树,再将老树保持10分钟左右)。这可能是错误的假设,即邻近的IP可能会表现出类似的行为,但会优雅地降级为仅将IPv4集群到(例如)/ 24中。

如果您感觉特别慷慨,可以在登录时存储一个单独的cookie,在登出时不会清除,并将副本保存在数据库中(128位随机值应该足够好)。在登录尝试时,如果它提供正确的cookie,则对浏览器“更好”(例如,允许在该cookie上尝试3次而不计算每IP或每用户的故障率)。这意味着,即使用户帐户被强制执行,用于访问帐户的最后一台计算机也不会显示CAPTCHA。

一般来说,谈论密码熵比密码长度和“字符类型”更有用 - 我很确定几乎每个人都只是制作第一个字母大写并且在结尾处加上1。我还没有看到任何“人性化”的密码生成器,它也说明了密码熵。