1

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

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

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

更新

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

4

2 回答 2

1

Spring security 提供声明式安全性。我假设您正在为您的应用程序使用 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 security 本身不会为记住我提供更好的实现。但是,我认为可以考虑它提供的其他优势。

于 2013-04-16T20:28:25.037 回答
0

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

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

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

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

于 2013-04-17T12:40:25.423 回答