代码之家  ›  专栏  ›  技术社区  ›  Kelly Robins

保护基于cookie的身份验证

  •  14
  • Kelly Robins  · 技术社区  · 15 年前

    我目前正在重新考虑我的一个Web应用程序,我希望能得到一些关于提高我的安全性的建议。

    我将注意到应用程序在ASP.NET中,当前的实现阻止我使用集成身份验证。这绝不是一个需要高安全性的应用程序,我只是喜欢把我的基础覆盖起来。

    过去我存储了身份证和一个令牌。 令牌是用户ID+用户salt的散列值(重用auth信息中的值) 当用户访问站点时,将根据令牌检查ID并相应地进行授权。

    我突然想到这里有一个大洞。 理论上,如果有人得到了一个salt值,他们需要做的就是猜测散列算法并迭代可能的ID,直到他们进入。我不希望发生这种情况,但这似乎仍然是一个错误。

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

    4 回复  |  直到 15 年前
        1
  •  12
  •   sipsorcery    15 年前

    大多数网站的做法是验证使用情况,如果成功,他们会向浏览器发送一个cookie来存储和发送任何后续请求。如果攻击者能够(在令牌到期之前)获得该令牌,他们将能够模拟用户。

    因此,cookie和身份验证过程应该始终在HTTPS会话上执行。攻击者获得cookie的唯一真正方法是在最终用户的计算机上截取cookie,如果他们能够做到这一点,他们可能会安装一个按键记录程序,并获取用户的密码。

    至于要使用哪种令牌,只要它是伪随机的,足以让攻击者猜测它的计算开销,就不重要了。我自己用吉他。如果您需要在cookie中除sessionid之外的额外信息,您可以在cookie中附加一个guid,然后可能只是为了使用皮带和大括号方法对其进行哈希或加密。

        2
  •  4
  •   ZZ Coder    15 年前

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

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

    这种方法有以下优点:

    1. 它非常安全。会话ID只是一个随机数。你不必担心被泄露的钥匙或盐。
    2. cookie可以很容易地从服务器上撤销。您所要做的就是删除会话记录,这会使ID变得无用。
    3. cookie值可能非常短。

    如果这对您不起作用,请尝试加密。哈希是我最后的选择。哈希本身是无用的。您必须清楚地将用户ID和其他信息存储在不同的cookie中。你最终暴露了用户信息。

        3
  •  3
  •   Noon Silk    15 年前

    两种方式:

    1. 使用对称算法(AES)对其进行加密。

    这很好,因为它可以让你解密它;但有人可能会认为你不需要解密它(这取决于你存储在那里的其他东西)。

    1. 搞砸 和符号 它。这同样使用了一个私钥,所以即使有人知道确切的内容,他们也不能复制散列,因为他们需要私钥。

    我可能(并且以前)会选择1。

        4
  •  0
  •   Marius    15 年前

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

    其他事项: 仅将cookie设为http,即不能用javascript设置。 如果它是一个选项,则使其仅使用https数据传输