2011-12-16 76 views
1

我有一个关于cookie安全性的简单问题,我想在执行它之前我想由stackoverflow社区运行。这将是我第一次在网站上实现用户登录,并且我希望对安全性非常谨慎 - 所以不必担心账户被破坏。Cookie安全

这里是我的假设的安全解决方案:

  • 用户注册网站(无论是通过电子邮件的注册,与Facebook等登录),并分配一个用户ID号。这个号码是公开的,可以用来访问用户的个人资料,在帖子中引用他们,等等。
  • 在注册时,用户还会被分配一个随机生成的ROWID,因为他们的信息存储在数据库中(托管在Google Fusion Tables上)。此ROWID号码对用户保持隐藏状态,永不泄露。
  • 用户ID是针对ROWID号码加密的,此号码存储在用户计算机上的cookie中。这对其他用户来说是不可见的,理论上这只能由用户查看。

该解决方案将允许“秘密”密钥(ROWID号码),“消费者”密钥(保存在cookie中)和公共参考ID(用户ID)。当然,所有这些都会汇集到一个数据库中,网站可以快速访问它们。这听起来像一个提供适当安全级别的计划,还是我应该考虑的其他事情?

回答

5

为了通过类似XSS的其他保护措施防止cookie盗用,您可能需要考虑为每个IP地址分配唯一的cookie,然后确保cookie只能从该IP地址使用。 如果您将Cookie存储在数据库中,事情会变得复杂,因为您现在有多个映射到同一用户的Cookie。

以下是如何避免这些问题:

Set-Cookie: userName=Alice; authCode=eeba95a4... 

其中:AUTHCODE = HMAC(ROWID,用户名+ IPADDR)

当您收到此cookie,查找用户数据库,重新计算/使用请求的ROWID和IP地址验证cookie中的authCode。无需在数据库中存储Cookie。

对于额外的加密点,扔掉salt参数到混合:

Set-Cookie: userName=Alice; salt=59843...; authCode=eeba9... 

其中:随机地生成用于每饼干AUTHCODE = HMAC(ROWID,用户名+ IPADDR +盐)

盐值你生产。没有必要保守秘密。

+0

谢谢!这非常有用!一般来说,我对编程还是很陌生的,所以我不知道甚至存在这样的东西!肯定会努力实现这样的事情! – 2011-12-31 02:22:44

1

这是一个很好的问题,既然你还没有答案,我会放弃它。据我所知(我不是密码专家),这似乎是合理的,至少在理论上是如此。 我看到一个问题,那就是如果一个恶意用户获得了用户密钥(并且没有以任何方式保护),他可以尝试强制ROWID,因为他已经知道用户ID。因此,在加密之前,至少应该在用户标识中添加某种盐。此外,“消费者”密钥ccokie应该仅以安全方式传递,确保它永远不会以未加密的连接传播。

但这一切都取决于你计划使用不同的键。

+0

这绝对听起来像是要考虑的事情!实际上,在我发布了这个内容并有更多时间考虑思考之后,我考虑将该用户的用户ID和来自注册时间的时间戳的组合用作加密密钥。这将(在我看来)增加了另一层安全性,因为时间戳不会是公开信息。也许我甚至可以通过某种形式的计算来运行时间戳,以进一步防止蛮力被使用。感谢您的输入! – 2011-12-31 02:17:51