保护基于Cookie的身份验证

时间:2009-08-16 06:18:29

标签: security cookies

我目前正在考虑我的一个网络应用程序,我希望提供一些有关提高安全性的建议。

我会注意到该应用程序位于ASP.net中,当前的实现阻止我使用集成身份验证。这也绝不是一个需要高安全性的应用程序,我只是喜欢我的基础。

过去我存储过id和令牌。 令牌是用户ID +用户的Salt(重用auth信息中的值)的哈希值 当用户访问该站点时,将针对该令牌检查ID并相应地进行authed。

我觉得这里有个大洞。 从理论上讲,如果有人掌握了盐值,他们需要做的就是猜测哈希算法并迭代可能的ID,直到他们进入。我不认为这会发生,但它似乎仍然是一个错误。

有关如何正确确认用户cookie未被更改的任何建议?

4 个答案:

答案 0 :(得分:12)

大多数网站的做法是对使用进行身份验证,如果成功,他们会向浏览器发送cookie以存储并发送任何后续请求。如果攻击者能够获得令牌(在它过期之前),他们将能够模拟用户。

因此,cookie和身份验证过程应始终通过https会话执行。攻击者必须抓住cookie的唯一方法是在最终用户的计算机上拦截它,如果他们能够这样做,他们可能会安装一个击键记录器并获得用户的密码。

关于使用什么类型的令牌无关紧要,只要它的伪随机性足以让攻击者猜测计算成本高昂。我自己使用GUID。如果你需要cookie中的额外信息,除了一个sessionid,你可以附加一个GUID,然后可能哈希或加密它只是为了一个腰带和括号方法。

答案 1 :(得分:4)

最好的方法是将会话ID存储为cookie值。

每当用户登录时,您都会在数据库或其他具有随机会话ID的会话存储中创建记录。将ID放入cookie中。稍后查看cookie时,您可以从数据库中检索所有用户信息。

这种方法具有以下优点,

  1. 非常安全。会话ID只是一个随机数。您不必担心密钥或盐的泄露。
  2. 可以从服务器轻松撤销cookie。您所要做的就是删除会话记录并使ID无效。
  3. Cookie值可能非常短。
  4. 如果这对您不起作用,请尝试加密。哈希将是我的最后选择。哈希本身毫无用处。您必须以明确的方式将用户ID和其他信息存储在不同的cookie中。您最终公开了用户信息。

答案 2 :(得分:3)

两种方式:

  1. 使用对称算法(AES)对其进行加密。
  2. 这很好,因为它可以解密它;但可能有人认为你不需要解密它(取决于你在那里存储的其他东西)。

    1. 哈希并签名。这又使用了一个私钥,所以即使有人知道确切的内容,他们也无法重现哈希,因为他们需要私钥。
    2. 我可能(以前有)选择#1。

答案 3 :(得分:0)

为什么不将哈希存储在cookie或任何其他伪随机数中呢?然后检查数据库以获取用户ID。

其他事项: 仅使cookie为http,即无法使用javascript设置 如果是一个选项,请仅使用https数据传输