【问题标题】:Remember me functionality + other security concerns记住我功能+其他安全问题
【发布时间】:2013-04-09 09:36:36
【问题描述】:

我想为已登录的用户实现一个简单的记住我,以便他们在关闭浏览器后保持登录状态。所以我正在考虑创建一个 cookie,它包含由 UUID.randomUUID 生成的唯一密钥,并在服务器端将其映射到用户名。

这足够安全吗?有哪些风险?我应该采取预防措施来防止黑客尝试随机密钥吗?

我正在考虑使用 spring security 或 apache shiro 之类的身份验证框架,但我找不到它们给我带来的任何好处(我不需要复杂的访问控制,只需用户注册/登录)。我是否遗漏了一些在安全方面至关重要的东西?

更新

我想我的问题实际上是:像 spring 和 shiro 这样的框架是否做了一些更复杂的事情来记住我的功能,从而产生我可能无法匹配的安全性?

【问题讨论】:

  • 足够安全吗?取决于什么。任何重要的事情都不应该这样处理。黑客可以并且将会尝试随机密钥——或者更糟的是,进行中间人攻击并通过窃听网络来读取您的会话 ID。
  • 你很容易受到重放攻击,例如。就安全性而言,任何不颁发客户证书的东西都确实有点模糊。有关重放攻击的信息,请参阅en.wikipedia.org/wiki/Replay_attack
  • 通过 http 发送时,一切都是不安全的。大多数网站都生活在这个现实中。至于使用 uuid,我认为这比 sha1(username . uuid); 更可预测。使它们特别成问题的 cookie 是它们在每个客户端请求中发送。

标签: java spring-security shiro


【解决方案1】:

Spring 安全性提供声明式安全性。我假设您正在为您的应用程序使用 spring 框架。 Spring 安全性和 Spring 框架通常提供了灵活性,直到需要它时您才会意识到。我曾经遇到过需要意外定制的情况,我很感谢 Spring。

Spring security 允许您轻松插入身份验证模型 - 基于 DB、基于 LDAP 等。它提供了一个默认登录页面(如果您想使用一个),根据访问的 URL 提供到登录页面的重定向,并允许用户继续身份验证完成后的 URL 等等,这减少了要编写的样板代码的数量。它还提供了记住我的实现。 http://static.springsource.org/spring-security/site/docs/3.0.x/reference/remember-me.html。但是,需要详细考虑安全隐患。

Spring 安全性本身不会为记住我提供更好的实现。但是,我认为可以考虑它提供的其他优势。

【讨论】:

    【解决方案2】:

    让我们从“记住我功能如何工作?”的答案开始。 spring-security 和 shiro 都有类似的记住我服务实现。他们将加密的主题保存在 cookie 中,然后从该 cookie 验证用户。意思是服务器用Set-Cookie:<character sequence>向客户端发送响应,然后客户端用Cookie:<character sequence>发送请求。

    现在假设我们要登录某人的帐户:

    1. 我们可以使用受害者的计算机。 (所以永远不要执行 高度敏感的操作,如果用户通过记住身份验证 我的服务)。这也可以应用于用户名密码 会话未完成时的身份验证(浏览器打开)和 受害者去吃午饭。
    2. 我们可以分析http流量来检索cookie头然后签名 在使用这个标题。 (所以你可以使用 https 来阻止流量 分析)。这也可以应用于用户名密码 身份验证。
    3. 我们可以尝试随机密钥(您可以在 结合一些复杂的主题编码算法)。这个可以 也适用于用户名密码认证。

    结论:如果用户通过记住我服务进行身份验证,则永远不要执行高度敏感的操作。如果需要,请使用 https。使用蛮力防御。想想加密。

    【讨论】:

      猜你喜欢
      • 2017-08-10
      • 2023-04-01
      • 2015-11-06
      • 2012-12-04
      • 2012-05-22
      • 2011-10-20
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      相关资源
      最近更新 更多