zoukankan      html  css  js  c++  java
  • 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=="));
  • 相关阅读:
    1、编写一个简单的C++程序
    96. Unique Binary Search Trees
    python 操作redis
    json.loads的一个很有意思的现象
    No changes detected
    leetcode 127 wordladder
    django uwsgi websocket踩坑
    you need to build uWSGI with SSL support to use the websocket handshake api function !!!
    pyinstaller 出现str error
    数据库的读现象
  • 原文地址:https://www.cnblogs.com/guanghe/p/10689662.html
Copyright © 2011-2022 走看看