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