我正在尝试为用户编写一个简单的HTTP记住我的身份验证系统。
我的用户可以这样表示
{
"email" : "foo@bar.com",
"password" : "8EC41F4334C1B9615F930270A4F8BBC2F5A2FCD3" // sha1 hash of password
}
所以我的想法是我需要创建一个具有无限期(非常长)到期时间的cookie,它将保存某种类型的信息,以便我从数据库中获取用户,从而登录用户。
我的第一个想法是只将email:password
字符串存储为cookie。我认为这样做会很好,因为除了用户本身之外,没有其他人可以真正生成那种类型的信息,而且我可以通过简单地根据username
和password
基于什么来比较来轻松检索用户。数据库中。
但是我认为这不是很好。它将密码摘要有效地转换为第二个密码,该密码存储在clear中,并在每个请求中通过线路传递。
那么我想也许每次用户登录时都可以生成signature
,这基本上是一个直接存储在数据库中用户对象的随机哈希。
用户登录后,会生成此存储的签名,并且cookie会保留此签名。每当您访问该网站时,该网站都会检查哪个用户具有该特定签名并将该用户登录。注销将有效地删除该cookie,并且新登录将生成新的随机签名。
此方法是否考虑了其他任何漏洞?
我知道,我应该使用已经为此制作的图书馆,但这只是网络安全的练习。
答案 0 :(得分:1)
这基本上是大多数网站在您登录时所执行的操作。是的,Cookie应该包含用户“会话”的唯一标识符。 cookie应该基本上是随机的。由您决定是否在浏览器会话中保持持久性。
与身份验证数据库中的cookie一起,还会存储创建条目的时间戳。超过N秒的Cookie应视为无效(根据您的喜好设置N)。您可以在每次使用cookie时重置时间戳,以便空闲会话超时。
请注意,同一个用户可能希望拥有多个会话(您是否从家庭和工作中登录过您的电子邮件帐户?),因此这里的概念实际上是“会话”,而不是用户。
答案 1 :(得分:0)
漏洞的观点都是一样的! Cookie窃取和相关机制,但浏览器现在足够聪明,所以你不必担心。
第二种方法在隐私方面也很好,因为它不包括cookie中的电子邮件地址。它似乎更类似于存储sessionID,在您的情况下,您生成一个随机哈希并将其存储在数据库中。
但我认为使用第一种方法会更明智;您可以在摘要中添加另一个图层,并使用您的一些算法或私钥对其进行加密;更加安全。