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

fed*_*lov 8 java remember-me shiro

关于Shiro记得我的功能我几乎没有问题:

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

Ric*_*ich 8

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

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

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

  2. 是!

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

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

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

  3. 你必须信任客户!

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

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

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

打开Shiro错误

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


bri*_*art 2

  1. 关于这个问题无法澄清太多。
  2. 请参阅这篇BalusC 博客文章。它提到了黑客和默认密钥。
  3. 默认情况下,cookie 的最长期限rememberMe为一年。根据 Shiro 文档,您可以通过以下方式控制该 cookie 的最大年龄rememberMeManager

    securityManager.rememberMeManager.cookie.maxAge = [max_age_in_seconds];
    
    Run Code Online (Sandbox Code Playgroud)