我刚读了一篇文章说7个字符的密码不再安全。但是,如果服务器在每次登录尝试后增加重试登录尝试的时间,那么暴力攻击就没用了。你如何在asp.net中创建这样的逻辑?不知怎的,我猜服务器端代码需要记住试图登录的ip-address,并且每次尝试都会增加响应时间?
答案 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成员资格无法为您做些事情,例如:
有关安全最佳做法的更多信息,请查看OWASP
答案 3 :(得分:1)
您可能需要担心至少有三次攻击:
您可以将每个IP的尝试存储到树中,在树中将树的密集部分组合在一起。然后把它捣蛋(每隔10分钟建一棵新树,再将老树保持10分钟左右)。这可能是错误的假设,即邻近的IP可能会表现出类似的行为,但会优雅地降级为仅将IPv4集群到(例如)/ 24中。
如果您感觉特别慷慨,可以在登录时存储一个单独的cookie,在登出时不会清除,并将副本保存在数据库中(128位随机值应该足够好)。在登录尝试时,如果它提供正确的cookie,则对浏览器“更好”(例如,允许在该cookie上尝试3次而不计算每IP或每用户的故障率)。这意味着,即使用户帐户被强制执行,用于访问帐户的最后一台计算机也不会显示CAPTCHA。
一般来说,谈论密码熵比密码长度和“字符类型”更有用 - 我很确定几乎每个人都只是制作第一个字母大写并且在结尾处加上1。我还没有看到任何“人性化”的密码生成器,它也说明了密码熵。