关于Shiro记得我的特色,我几乎没有问题:
CipherKey
?答案 0 :(得分:8)
Shiro的默认"记得我"功能完全成问题,正是因为你在这里找到了原因。这是一个很好的问题。当我开始深入研究它们的实现时,我发现了同样的问题。
因为每次都使用随机IV
记住我" cookie仅包含" Principals",即您的用户名,使用AES加密(默认情况下)。每次登录时,完全相同的信息都将使用完全相同的密钥进行加密。 Shiro默认使用随机IV - 请参阅JcaCipherService,因此加密的二进制blob在每次登录时都会随机出现。
YES!
如果黑客知道您网站上任何帐户的用户名,并且您使用Shiro的默认设置,那么他们很容易生成有效的"记住我"令牌并登录到您的网站。
希望您已经使用" @ RequiresAuthentication"标记了所有敏感操作,并且不允许只有记住的用户看到任何敏感的内容,尽管如果您不这样做,这将是一个很容易犯的错误
出于这个原因,我认为Shiro在这里使用默认密钥是一个很大的安全漏洞。我认为Shiro应该默认使用随机密钥,或者如果你想使用&#34,则要求你指定一个新密钥;记住我"。参见例如https://github.com/pledbrook/grails-shiro/issues/28
你必须信任客户!
记住我" cookie设置为"最大年龄"默认情况下为1年 - 请参阅CookieRememberMeManager
。
但是,Shiro在加密的cookie数据中不包含任何日期信息,因此无法验证客户是否已遵守此时间限制。
我认为这是一个安全漏洞,Shiro应该在加密数据中包含生成日期,并验证此服务器端。
以下Shiro错误现在可以跟踪这些问题:
答案 1 :(得分:2)
默认情况下,rememberMe
Cookie的最长年龄为一年。根据Shiro文档,您可以使用rememberMeManager
控制该Cookie的最大年龄:
securityManager.rememberMeManager.cookie.maxAge = [max_age_in_seconds];