我有一个登录页面,要求输入用户名和密码。此页面有一个复选框“记住我”。
身份验证是:对于提供的用户名,使用存储在用户数据库记录中的盐将提供的密码转换为哈希,并将哈希与存储的哈希进行比较。
当用户勾选该框时,我应该在他们的 cookie 中存储什么以便他们下次访问时自动登录?
我在想一个好方法是将他们的用户名和密码的哈希值存储在 cookie 中,并在下次访问时重新验证用户。盐将被保存在数据库中。
我有一个登录页面,要求输入用户名和密码。此页面有一个复选框“记住我”。
身份验证是:对于提供的用户名,使用存储在用户数据库记录中的盐将提供的密码转换为哈希,并将哈希与存储的哈希进行比较。
当用户勾选该框时,我应该在他们的 cookie 中存储什么以便他们下次访问时自动登录?
我在想一个好方法是将他们的用户名和密码的哈希值存储在 cookie 中,并在下次访问时重新验证用户。盐将被保存在数据库中。
我不会在客户端 cookie 中存储散列密码。我会在用户和长期会话之间创建另一个抽象。我将首先阅读以下文章以了解有关挑战的一些想法:
http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/
那篇文章的关键部分是,并非所有登录名都应该相同。
这取决于您要维护的安全级别。当我选中“记住我”框时,我只希望它记住我的用户名。我仍然想照常提供我的密码。
将用户名和哈希密码存储在 cookie 中,对我来说似乎是个坏主意。
如果你真的想让用户保持登录状态,那么你应该在 cookie 中存储一个唯一的登录令牌,而不是用户名或哈希密码。当您的服务器收到登录令牌时,您可以将其与您的持久登录用户数据库进行比较,并查看该令牌对应于哪个用户。服务器应存储登录令牌、与该令牌关联的用户名和到期时间。一旦使用了令牌,它就应该失效,因此它不能被重用。
这最大限度地减少了泄露给客户端的信息,并且限制了攻击者在设法窃取 cookie 时恢复合法用户密码的机会(这相对容易做到)。
我强烈建议您还为所有 cookie 设置安全标志,以便它们仅通过安全连接发送,并确保持久登录的超时时间相对较短。此外,最好进行额外的授权检查,例如确保登录令牌与特定 IP 地址或浏览器指纹相关联,以帮助防止随意攻击。这仍然不会严重阻碍坚定的攻击者,但可能会劝阻一些脚本小子。
最后,请考虑接受@Craig T 的建议,只记住用户名,而不是让用户保持登录状态。持久登录非常危险,因此您应该仔细考虑用户从中获得的价值与潜在成本。
将密码正确存储在数据库中对您有好处!令人惊讶的是,有多少人认为他们不需要盐。