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
博客园地址:https://www.cnblogs.com/lixiuming521125/

浙公网安备 33010602011771号