记住用户复选框的良好安全方式
Posted
技术标签:
【中文标题】记住用户复选框的良好安全方式【英文标题】:Good secure way to remember a user checkbox 【发布时间】:2012-01-04 10:39:06 【问题描述】:我有一个要求输入用户名和密码的登录页面。此页面有一个复选框“记住我”。
身份验证是:对于提供的用户名,使用存储在用户数据库记录中的盐将提供的密码转换为哈希,并将哈希与存储的哈希进行比较。
当用户勾选该框时,我应该在他们的 cookie 中存储什么以便他们下次访问时自动登录?
我认为一个好方法是将用户名和密码的哈希值存储在 cookie 中,并在用户下次访问时重新验证用户身份。盐将被保存在数据库中。
【问题讨论】:
【参考方案1】:我不会在客户端 cookie 中存储散列密码。我会在用户和长期会话之间创建另一个抽象。我将首先阅读以下文章以了解有关挑战的一些想法:
http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/
那篇文章的关键部分是,并非所有登录名都应该相同。
【讨论】:
好文章。但是,您根本不需要将用户名放入 cookie 中,您只需要大随机数即可。用户名和时间戳可以是服务器端的。 @CameronSkinner 我认为他的意思是用户名特别“秘密”,因此它不太可能发现冲突。如果它只是一个很大的随机数,那么理论上你可以向服务器发送垃圾邮件并尝试以任何人身份登录......即使你有正确的密钥,你也需要将它放在正确的门中。 我怀疑有人会争辩说:) 您可以总是向服务器发送垃圾邮件并尝试以任何人身份登录。将用户名放入 cookie 并不能阻止这种情况,它只会略微增加攻击者需要采样的空间。您可以将用户名视为大随机数的一个非常低的熵。如果您要向 cookie 添加 10 个字节来存储用户名,为什么不直接添加 10 个字节的随机性呢?然后你真正地减少碰撞的可能性。这里的关键是攻击者在猜测 - 所以让它尽可能随机。【参考方案2】:这取决于您要维护的安全级别。当我选中“记住我”框时,我只希望它记住我的用户名。我仍然想照常提供我的密码。
在 cookie 中存储用户名和散列密码,对我来说似乎是个坏主意。
【讨论】:
@Valamas,正如 Craig 指出的那样,在 cookie 中存储密码(无论是否散列)是一个坏主意。你不会从中得到任何额外的东西。而是将用户名和时间戳以加密形式存储在 cookie 中。此令牌的存在基本上会告诉您您的用户已通过身份验证。此外,ASP.NET Forms Authentication 已经内置了所有这些功能,因此您真的不必重新发明***。使用persistCookie
参数。
@VinayC:这不是您第一次很好地指导我使用表单身份验证。我现在已经在我的 FormsAuthenticationService 类中正确连接了它。谢谢【参考方案3】:
如果你真的想让用户保持登录状态,那么你应该在 cookie 中存储一个唯一的登录令牌,而不是用户名或哈希密码。当您的服务器收到登录令牌时,您可以将其与您的持久登录用户数据库进行比较,并查看该令牌对应于哪个用户。服务器应存储登录令牌、与该令牌关联的用户名和到期时间。令牌一旦被使用,就应该失效,因此不能重复使用。
这最大限度地减少了泄露给客户端的信息,并且限制了攻击者在成功窃取 cookie 时恢复合法用户密码的机会(这相对容易做到)。
我强烈建议您还为所有 cookie 设置安全标志,以便它们仅通过安全连接发送,并确保持久登录的超时时间相对较短。此外,最好进行额外的授权检查,例如确保登录令牌与特定 IP 地址或浏览器指纹相关联,以帮助防止随意攻击。这仍然不会严重阻碍坚定的攻击者,但可能会劝阻一些脚本小子。
最后,请考虑接受@Craig T 的建议,只记住用户名,而不是让用户保持登录状态。持续登录非常危险,因此您应该仔细考虑用户从中获得的价值与潜在成本。
感谢您在数据库中正确存储密码!令人惊讶的是,有多少人认为他们不需要盐。
【讨论】:
优秀。在安全属性上 +1 - 我现在将设置开发站点的 https 版本以确保这一点。以上是关于记住用户复选框的良好安全方式的主要内容,如果未能解决你的问题,请参考以下文章
如何在 html/php 站点中记住用户帐户中的复选框首选项
以编程方式启用Windows Phone 7应用程序中的禁用复选框