说明:shiro低版本使用固定默认密钥,有被攻击的风险,可以升级shiro版本,Apache官方已在1.2.5及以上版本中修复此漏洞,但是此方式有依赖冲突的风险。这里说说不升级版本的解决方案,这方案和官方的方案一样,都是使用生成的随机密钥
1、创建随机生成密钥工具
public class GenerateCipherKey {
/**
* 随机生成秘钥,参考org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey(int)
* @return
*/
public static byte[] generateNewKey() {
KeyGenerator kg;
try {
kg = KeyGenerator.getInstance("AES");
} catch (NoSuchAlgorithmException var5) {
String msg = "Unable to acquire AES algorithm. This is required to function.";
throw new IllegalStateException(msg, var5);
}
kg.init(128);
SecretKey key = kg.generateKey();
byte[] encoded = key.getEncoded();
return encoded;
}
}
2、配置shiro安全管理器,使用密钥生成工具生成的随机密钥
<!-- 安全管理器 -->
<bean id="defaultWebSecurityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="rememberMeManager" ref="rememberMeManager"/>
</bean>
<!--使用动态密钥生成工具-->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cipherKey" value="#{T(com.xxx.utils.GenerateCipherKey).generateNewKey()}"></property>
</bean>
附上漏洞检测工具地址:https://github.com/wyzxxz/shiro_rce_tool