四郎:怎么记得我的工作?

时间:2014-10-29 19:42:17

标签: java shiro remember-me

关于Shiro记得我的特色,我几乎没有问题:

  1. 为什么Shiro产生不同的"记住我"每次登录时同一帐户的令牌值?
  2. 黑客是否能够生成一个"记住我"如果我使用默认的CipherKey
  3. ,任何帐户的令牌
  4. 我如何控制"记住我"时间?按Cookie年龄?因此,如果客户端cookie永远不会过期,那么#34;记住我" cookie会永远有用吗?

2 个答案:

答案 0 :(得分:8)

Shiro的默认"记得我"功能完全成问题,正是因为你在这里找到了原因。这是一个很好的问题。当我开始深入研究它们的实现时,我发现了同样的问题。

  1. 因为每次都使用随机IV

    记住我" cookie仅包含" Principals",即您的用户名,使用AES加密(默认情况下)。每次登录时,完全相同的信息都将使用完全相同的密钥进行加密。 Shiro默认使用随机IV - 请参阅JcaCipherService,因此加密的二进制blob在每次登录时都会随机出现。

  2. YES!

    如果黑客知道您网站上任何帐户的用户名,并且您使用Shiro的默认设置,那么他们很容易生成有效的"记住我"令牌并登录到您的网站。

    希望您已经使用" @ RequiresAuthentication"标记了所有敏感操作,并且不允许只有记住的用户看到任何敏感的内容,尽管如果您不这样做,这将是一个很容易犯的错误

    出于这个原因,我认为Shiro在这里使用默认密钥是一个很大的安全漏洞。我认为Shiro应该默认使用随机密钥,或者如果你想使用&#34,则要求你指定一个新密钥;记住我"。参见例如https://github.com/pledbrook/grails-shiro/issues/28

  3. 你必须信任客户!

    记住我" cookie设置为"最大年龄"默认情况下为1年 - 请参阅CookieRememberMeManager

    但是,Shiro在加密的cookie数据中不包含任何日期信息,因此无法验证客户是否已遵守此时间限制。

    我认为这是一个安全漏洞,Shiro应该在加密数据中包含生成日期,并验证此服务器端。

  4. 打开Shiro错误

    以下Shiro错误现在可以跟踪这些问题:

答案 1 :(得分:2)

  1. 无法澄清这个问题。
  2. 请参阅this BalusC博文。它提到了黑客和默认密码密钥。
  3. 默认情况下,rememberMe Cookie的最长年龄为一年。根据Shiro文档,您可以使用rememberMeManager控制该Cookie的最大年龄:

    securityManager.rememberMeManager.cookie.maxAge = [max_age_in_seconds];