1

在我深入实施之前,我有一个关于 cookie 安全性的快速问题,我想由 stackoverflow 社区运行。这将是我第一次在网站上实现用户登录,我希望对安全性非常谨慎,以免担心帐户被盗用。

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

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

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

4

2 回答 2

5

为了防止通过 XSS 等方式窃取 cookie,您可能需要考虑为每个 IP 地址发出唯一的 cookie,然后确保 cookie 只能从该 IP 地址使用。如果您将 cookie 存储在数据库中,事情会变得复杂,因为您现在有多个 cookie 映射到同一个用户。

以下是避免这些问题的方法:

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

其中:authCode= HMAC (ROWID, userName + ipAddr)

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

对于额外的加密点,将参数添加到组合中:

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

其中:authCode=HMAC(ROWID, userName + ipAddr + salt)

盐值是为您生产的每个 cookie 随机生成的。没有必要保密。

于 2011-12-25T22:44:48.180 回答
1

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

但这一切都取决于您打算使用不同的密钥做什么。

于 2011-12-23T16:09:37.673 回答