• Unable to execute 'doFinal' with cipher instance


      今天项目启动后登录项目,突然爆出Unable to execute 'doFinal' with cipher instance错误。清除cookie登录测试,又不报错了,以前也见过类似问题,因为不影响使用,于是就忽略了,今天又遇到了,特研究一下。

      原来,项目中使用Shiro作为认证权限控制框架,问题就出在RememberMe功能的配置上。问题产生的原因是rememberMe的cookie在第二次打开页面后shiro无法解密。

    项目配置

     1 @Bean
     2     public RememberMeManager rememberMeManager() {
     3         CookieRememberMeManager rememberMeManager = new CookieRememberMeManager();
     4         //注入自定义cookie(主要是设置寿命, 默认的一年太长)
     5         SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
     6         simpleCookie.setHttpOnly(true);
     7         //设置RememberMe的cookie有效期为7天
     8         simpleCookie.setMaxAge(604800);
     9         rememberMeManager.setCookie(simpleCookie);10         return rememberMeManager;
    11     }

    框架源码

     1 public AbstractRememberMeManager() {
     2     this.serializer = new DefaultSerializer<PrincipalCollection>();
     3     AesCipherService cipherService = new AesCipherService();
     4     this.cipherService = cipherService;
     5     setCipherKey(cipherService.generateNewKey().getEncoded());
     6 }
     7 
     8 public void setCipherKey(byte[] cipherKey) {
     9     //Since this method should only be used in symmetric ciphers
    10     //(where the enc and dec keys are the same), set it on both:
    11     setEncryptionCipherKey(cipherKey);
    12     setDecryptionCipherKey(cipherKey);
    13 }

      rememberMeManager继承了AbstractRememberMeManager,然而AbstractRememberMeManager的构造方法中每次都会重新生成对称加密密钥,意味着每次重启程序都会重新生成一对加解密密钥。

      这就会导致了,第一次启动程序shiro使用A密钥加密了cookie,第二次启动程序shiro重新生成了密钥B,当用户访问页面时,shiro会用密钥B去解密上一次用密钥A加密的cookie,导致解密失败,导致报错,所以这不影响用户登录操作(rememberMe失效罢了),所以这种异常只会在程序重启(shiro清除session)第一次打开页面的时候出现。

      解决办法:手动设置对称加密秘钥。

    1 //手动设置对称加密秘钥,防止重启系统后系统生成新的随机秘钥,防止导致客户端cookie无效
    2         rememberMeManager.setCipherKey(Base64.decode("6ZmI6I2j3Y+R1aSn5BOlAA=="));
  • 相关阅读:
    【转载】MDX 去年当月值、差值、同比
    【原创】Analyzer安全性异常(应用程序视图执行安装策略不允许的操作)
    Analyzer普通用户登录不了[从网络访问此计算机]
    【转载】51CTO如何防止SQL注入的解决方法
    【转载】51CTOAndroidManifest.xml文件详解
    Eclipse插件安装方式
    Typemock揭示 安装其它三方软件可能引起冲突,那试试不安装直接引用它的DLL
    项目从VS2010 升 VS2012 遇到的代表性问题及解决
    c# comboBox模糊匹配
    sqlJDBC安装使用
  • 原文地址:https://www.cnblogs.com/guanghe/p/10689662.html
Copyright © 2020-2023  润新知