2009-07-03 54 views
1

我刚在网站上实现了用户登录的“记住我”功能。大多数建议是将用户标识存储在一个cookie中,然后有一些长而不可测的随机密钥。如果两者匹配,则认为用户已通过认证。两个安全密钥是否比一个更好?

确实有两个字符串有帮助吗?不会更长的键做完全相同的事情?

换句话说,不是两个密钥同样容易受到攻击作为一个更长的密钥吗? (我想这将是关键的总长度,不管你有多少)

注:可能有一些数据库查询效率的问题也在这里,例如,在数据库中查找一个大的UUID是不像寻找一个小号码那么简单。 (正切地说,Gmail使用六位数字作为他们的一次性登录令牌以及用户名。)

回答

1

在这SO thread健壮的讨论。

...用户被认为是认证的。

应该可能阅读认证但有限的授权。

每个评论:有点更安全,因为它是一次性使用,很难猜测。因此,如果cookie被破坏,攻击者必须迅速采取行动,否则令牌会被合法用户登录无效,而用户ID很可能不会长时间更改。

1

我不是加密专家,但只要您检查暴力破解企图,您应该能够使用短键(例如Gmail的6位数字)。真正的漏洞是人们在用户登录时收听(例如SideJacking)。

+0

谢谢,这就是我的想法。使用gmail的简短密钥,在尝试从cookie登录失败后,您可能不得不关闭用户。但是你不能在他们的会话中使用失败的尝试,因为这是不可信的......这个问题有点麻烦。 – 2009-07-03 09:09:20

1

在我以前创建的网站中,我使用了user_id和用户密码的哈希散列。我使用两个字段来验证用户的主要原因是它省去了添加另一个表的麻烦(因此使数据库设计变得复杂)。将user_id也存储在cookie中,我可以在用户中进行索引查找表,并有效地将盐渍散列匹配给用户。当然,你可以将user_id和hash连接成一个值,并将其存储在cookie中。

如果你只有一个随机的不可猜测的字符串,那么你将不得不有一个单独的表来关联随机字符串和用户ID,并为该特定用户做另一个查找。

+0

谢谢帕特里克。我想到了这一点,但是然后你没有简单的服务器端方法来使持久性会话无效... – 2009-07-03 09:10:14

+0

@Daniel Rosenstark 您可以将Cookie过期时间设置为任何您认为合适的时间。 – 2009-07-03 09:16:29

相关问题