Unable to execute 'doFinal' with cipher instance [javax.crypto.Cipher@3d52dc...

报错内容:

org.apache.shiro.crypto.CryptoException: Unable to execute 'doFinal' with cipher instance [javax.crypto.Cipher@58c5686a].

前提:

http://localhost:8080/emp/list 需要认证;

复现方法:

当http://localhost:8080/emp/list没有认证的时候,访问该地址,跳转到登入页面,且报错:

org.apache.shiro.crypto.CryptoException: Unable to execute 'doFinal' with cipher instance [javax.crypto.Cipher@58c5686a].;

解决办法:在realm配置中加入<property name="storedCredentialsHexEncoded" value="true"/>

 1 <bean id="jdbcRealm" class="ssm.shiro.ShiroRealm">
 2         <property name="credentialsMatcher">
 3             <bean
 4                 class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
 5                 <!-- 指定加密算法 -->
 6                 <property name="hashAlgorithmName" value="MD5"></property>
 7                 <!-- 可以指定加密的次数 -->
 8                 <property name="hashIterations" value="1024"></property>
 9                 <property name="storedCredentialsHexEncoded" value="true"/>
10             </bean>
11         </property>
12     </bean>
13     <bean id="secondShiroRealm" class="ssm.shiro.SecondShiroRealm">
14         <property name="credentialsMatcher">
15             <bean
16                 class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
17                 <!-- 指定加密算法 -->
18                 <property name="hashAlgorithmName" value="SHA1"></property>
19                 <!-- 可以指定加密的次数 -->
20                 <property name="hashIterations" value="1024"></property>
21                 <property name="storedCredentialsHexEncoded" value="true"/>
22             </bean>
23         </property>
24     </bean>

 

关于自定义过滤器出现该问题的解决方式:

问题出现原因:(参考链接:https://www.jianshu.com/p/7069d7973872

出现此问题是因为在shiro应用做了记住我功能,而这个功能在服务端通过cookie存储账号信息时,会对账号信息进行Base64加密,在加密时会创建一把密钥在服务端重启时会丢失,当我们再次通过浏览器访问服务时,因为客户端存储账号信息的cookie还是有效的,所以浏览器依旧会携带cookie到服务端,但是服务端解密cookie信息的密钥丢失,所以不能完成解密操作,就会出现如上异常。

 1 <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
 2         <constructor-arg value="rememberMe"/>
 3         <property name="httpOnly" value="true"/>
 4         <property name="maxAge" value="31536000"/><!-- 365天 -->
 5     </bean>
 6     <!-- rememberMe管理器 -->
 7     <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
 8         <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('qQFtSnnj/sx7vu51ixAyEQ==')}"/>
 9         <property name="cookie" ref="rememberMeCookie"/>
10     </bean>

qQFtSnnj/sx7vu51ixAyEQ== 这个是生成AES密钥

生成方式如下:

 1 @org.junit.Test
 2     public  void aes() {
 3         KeyGenerator keygen = null;
 4         try {
 5             keygen = KeyGenerator.getInstance("AES");
 6         } catch (NoSuchAlgorithmException e) {
 7             e.printStackTrace();
 8         }
 9         SecretKey deskey = keygen.generateKey();
10         System.out.println(Base64.encodeToString(deskey.getEncoded()));
11     }

 

参考连接地址:

https://www.cnblogs.com/pxblog/p/12576730.html

https://www.jianshu.com/p/7069d7973872



 

posted @ 2022-05-04 14:37  啄木鸟伍迪  阅读(1470)  评论(0)    收藏  举报
//火箭 GenerateContentList();