错误

工程中使用了shiro,最近启动工程后通过接口访问就一直在报错,跟踪了一下源码,发现是cookie导致的。错误如下:

org.apache.shiro.crypto.CryptoException: Unable to correctly extract the Initialization Vector or ciphertext.
at org.apache.shiro.crypto.JcaCipherService.decrypt(JcaCipherService.java:378)
at org.apache.shiro.mgt.AbstractRememberMeManager.decrypt(AbstractRememberMeManager.java:489)
at org.apache.shiro.mgt.AbstractRememberMeManager.convertBytesToPrincipals(AbstractRememberMeManager.java:429)
at org.apache.shiro.mgt.AbstractRememberMeManager.getRememberedPrincipals(AbstractRememberMeManager.java:396)
at org.apache.shiro.mgt.DefaultSecurityManager.getRememberedIdentity(DefaultSecurityManager.java:604)
at org.apache.shiro.mgt.DefaultSecurityManager.resolvePrincipals(DefaultSecurityManager.java:492)
at org.apache.shiro.mgt.DefaultSecurityManager.createSubject(DefaultSecurityManager.java:342)
at org.apache.shiro.subject.Subject$Builder.buildSubject(Subject.java:846)
at org.apache.shiro.web.subject.WebSubject$Builder.buildWebSubject(WebSubject.java:148)
at org.apache.shiro.web.servlet.AbstractShiroFilter.createSubject(AbstractShiroFilter.java:292)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:359)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2476)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2465)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at org.apache.shiro.crypto.JcaCipherService.decrypt(JcaCipherService.java:370)
... 35 more

分析

    /*** Default constructor that initializes a {@link DefaultSerializer} as the {@link #getSerializer() serializer} and* an {@link AesCipherService} as the {@link #getCipherService() cipherService}.*/public AbstractRememberMeManager() {this.serializer = new DefaultSerializer<PrincipalCollection>();AesCipherService cipherService = new AesCipherService();this.cipherService = cipherService;// 默认构造方法调用时,生成新的密钥setCipherKey(cipherService.generateNewKey().getEncoded());}

shiro底层有一个AbstractRememberMeManager的抽象实现,它是这个错误的罪魁祸首,服务端在接收cookie时,得到rememberMe的cookie值=>Base64解码=>AES解密=>反序列化(未限制)。
   shiro≤1.2.4版本预设使CookieRememberMeManager,由于AES使用的key泄露,导致反序化的cookie可控,从而引发反序化攻击。而且AbstractRememberMeManager的构造方法中每次都会重新生成对称加密密钥,意味着每次重启工程都会重新生成一对加解密密钥。这就会导致第一次启动工程shiro使用A密钥加密了cookie,第二次启动工程shiro重新生成了密钥B,当用户访问页面时,shiro会用密钥B去解密上一次用密钥A加密的cookie,导致解密失敗,形成报错,所以这不影响使用者登入操作(rememberMe失效罢了),所以这种异常只会在工程重启(shiro清除session)第一次开启页面的时候出现。

解决方案

1.升级shiro版本,shiro>1.2.4之后这个问题有相应的解决措施。
2.配置固定密钥,这种方法不建议,容易泄露。
3.最简单的方式,直接删除浏览器cookie。
以谷歌浏览器为例,直接找到cookie进行删除即可。


shiro文档可参考: https://shiro.apache.org/web.html#Web-RememberMeServices

shiro.crypto.CryptoException: Unable to correctly extract the Initialization Vector or ciphertext相关推荐

  1. 云服务器软件运行出错,云服务器程序运行中出现木马

    攻击补充 01:13:30.597 [http-nio-9070-exec-28] WARN o.a.s.m.AbstractRememberMeManager - [onRememberedPrin ...

  2. 更改tomcat文件导致项目无法启动记录org.apache.jasper.JasperException

    项目报错:org.apache.jasper.JasperException: /WEB-INF/views/modules/sys/sysLogin.jsp 2021-04-09 14:35:22, ...

  3. apache shiro_Apache Shiro第3部分–密码学

    apache shiro 除了保护网页和管理访问权限外, Apache Shiro还执行基本的加密任务. 该框架能够: 加密和解密数据, 哈希数据, 生成随机数. Shiro没有实现任何加密算法. 所 ...

  4. Apache Shiro第3部分–密码学

    除了保护网页和管理访问权限外, Apache Shiro还执行基本的加密任务. 该框架能够: 加密和解密数据, 哈希数据, 生成随机数. Shiro没有实现任何加密算法. 所有计算都委托给Java密码 ...

  5. Shiro 权限框架使用总结

    我们首先了解下什么是shiro ,Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨 ...

  6. Apache shiro介绍

    原文链接Application Security With Apache Shiro(翻译) 前面自己自己配合谷歌翻译,后面大部分谷歌翻译. 当你尝试保护你的程序时候你会被困扰吗?你会觉得现有的jav ...

  7. Shiro过滤器源码

    过滤器 Shiro还提供了过滤器,可以配置我们的过滤规则,过滤规则对顺序是有要求的,短路优先原则,也就是前面的适配成功之后,就不会再适配后面的规则了. Shiro是一个强大易用的Java安全框架,提供 ...

  8. Shiro的Java原生反序列化漏洞

    参考: http://www.lmxspace.com/2019/10/17/Shiro-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E8%AE%B0%E5%BD%95/ ...

  9. 让 Apache Shiro 保护你的应用

    让 Apache Shiro 保护你的应用 作者:Les Hazlewood 译者:胡伟红 查看英文原文: Application Security With Apache Shiro 在尝试保护你的 ...

  10. shiro保护你的应用程序

    [size=x-large][b]什么是Apache Shiro[/b][/size] Apache Shiro(发音为"shee-roh",日语"堡垒(Castle)& ...

最新文章

  1. python简单装饰器_简单介绍Python装饰器(一)
  2. 【Treap】bzoj1588-HNOI2002营业额统计
  3. LeetCode 663. 均匀树划分(树形DP)
  4. Select2的使用 联动筛选框的一个例子
  5. 监视和调整Linux网络协议栈:发送数据
  6. illegal text-relocation
  7. eclipse调试linux内核,Ubuntu下使用Eclipse+CDT+UML调试linux内核
  8. 下docfetcher先下Java,DocFetcher ── 以 JAVA 编写的开源桌面本地文件全文搜索工具...
  9. mobi 转 PDF最新方法 2017/11/21亲测可用
  10. 【转】英语词汇学习渐进
  11. Centos下因为双网卡配置不当导致无法访问外网故障解决办法
  12. PyCharm大学生教育账户激活
  13. 麦克马斯特计算机工程专业,麦克马斯特大学计算机专业成功录取
  14. tween.js 中文使用指南 1
  15. 周周有惊喜奖,第三期开奖名单 --2007中国软件开发者大调查
  16. 神策优质客户西瓜创客融资 1.5 亿,“AI+ 大数据”构造少儿编程新格局
  17. Macbook电池使用问题——电池充电管理
  18. python recv_python网络编程调用recv函数完整接收数据的三种方法
  19. 基于cv2模块的人脸识别
  20. springboot+学生信息管理 毕业设计-附源码191219

热门文章

  1. 固执的喷子,你悟到了成长的真谛吗?
  2. javaee第二阶段总结
  3. 【RDMA】RDMA编程实例(IBV Verbs )
  4. 【学习记录】基于知识图谱的虚假新闻检测
  5. 同样是搞IT,差距怎么这么大呢,快来看看互联网行业最富有的100人
  6. Ubuntu安装搜 狗输入法,最完整的步骤
  7. 《java程序设计基础》 抽象类
  8. 获取一组坐标的中心点
  9. html5图片漂浮代码,QQ空间免费漂浮代码怎么搞啊
  10. Android常用十大框架