【问题标题】:Securing Cookie Based Authentication保护基于 Cookie 的身份验证
【发布时间】:2010-11-19 23:52:17
【问题描述】:

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

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

过去我存储了 id 和 token 。 令牌是用户 ID + 用户 Salt 的哈希(重用来自 auth 信息的值) 当用户访问该站点时,将根据令牌检查 ID 并相应地进行身份验证。

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

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

【问题讨论】:

  • 我要补充一点,让我感到困扰的是,如果有人要获取站点的盐值和密码哈希,那么纯密码身份验证对他们没有任何好处。在我看来,一种好的 cookie 身份验证方法将以类似的方式运行。

标签: security cookies


【解决方案1】:

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

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

至于使用什么样的令牌并不重要,只要它是伪随机的,足以让攻击者猜测它的计算成本很高。我自己使用 GUID。如果除了 sessionid 之外,您还需要 cookie 中的额外信息,您可以将 GUID 附加到它,然后可能会散列或加密它,只是为了使用带和大括号的方法。

【讨论】:

  • 使用 cookie 身份验证时,您需要小心跨站脚本伪造 (CRSF)。浏览器代表用户发送凭据,也有可能欺骗浏览器将其发送给攻击者。但这可以使用随机数来防止/最小化。谷歌它以获取更多信息。
【解决方案2】:

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

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

这种方法有以下优点,

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

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

【讨论】:

  • zz 编码器:确实,如果您散列它,您将需要公开用户ID;它通常并不重要,因此暴露它没有问题。您的会话 ID 方法很好,但是,正如您所说,它必须在数据库中保存一些东西。如果信息必须存在很长时间,这可能不是我们所希望的。
【解决方案3】:

两种方式:

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

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

  1. 散列并签名它。同样,这使用了私钥,因此即使有人知道确切的内容,他们也无法重现哈希,因为他们需要私钥。

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

【讨论】:

    【解决方案4】:

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

    其他: 只做 cookie http,即不能用 javascript 设置 如果是选项,请使其仅与https数据一起传输

    【讨论】:

      猜你喜欢
      • 2020-10-08
      • 2021-08-13
      • 2020-09-16
      • 2021-06-24
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 2021-05-26
      相关资源
      最近更新 更多