caibikang个人博客

愿居于一城,与卿所见美好......

推荐文章

MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用

    在MySQL中可以使用IF()、IFNULL()、NULLIF()、ISNULL()函数进行流程的控制。


    1、IF()函数的使用

    IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。

    SELECT IF(TRUE,'A','B');    -- 输出结果:A
    
    SELECT IF(FALSE,'A','B');   -- 输出结果:B


    2、IFNULL()函数的使用

    IFNULL(expr1,expr2),如果expr1的值为null,则返回expr2的值,如果expr1的值不为null,则返回expr1的值。

    SELECT IFNULL(NULL,'B');    -- 输出结果:B
    
    SELECT IFNULL('HELLO','B'); -- 输出结果:HELLO


    3、NULLIF()函数的使用

    NULLIF(expr1,expr2),如果expr1=expr2成立,那么返回值为null,否则返回值为expr1的值。

    SELECT NULLIF('A','A');     -- 输出结果:null
    
    SELECT NULLIF('A','B');     -- 输出结果:A

    4、ISNULL()函数的使用

    ISNULL(expr),如果expr的值为null,则返回1,如果expr1的值不为null,则返回0。

    SELECT ISNULL(NULL);        -- 输出结果:1
    
    SELECT ISNULL('HELLO');     -- 输出结果:0

    ————————————————

    版权声明:本文为CSDN博主「pan_junbiao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/pan_junbiao/article/details/85928004

    阅读全文>>

作者:caibikang分类:【javaEE浏览(147评论(0

2021-04-30 13:53:00

shiro报错.crypto.CryptoException: Unable to ..

    shiro报错.crypto.CryptoException: Unable to correctly extract the Initialization Vector or ciphertext.

    这个错误困扰了我很久

    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

    这个错误后面还会带一个数组下标越界的异常,我仔细检查了spring与shiro的配置文件和springMVC的配置文件,确保自己的代码等相关配置没有问题,可是每次服务器启动就会伴随着这个错误,而且是报两次,在我进行登录认证时正常,也可以正常退出,但是后面引起了其他的问题,我不得不寻找其中的原因,网络上关于这个错误很少,有效的信息少之又少。

    终极解决

    直接清空浏览器的cookie的缓存,在不清楚到底是哪个缓存的情况下,我建议清空所有的cookie,问题可以得到解决,极有可能是当前浏览器在其他的网站中有过rememberMe的记录导致后台的shiro会用cookie去反序列化。

    错误原因

    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)第一次打开页面的时候出现。

    shiro的这个rememberMe功能有安全漏洞,详情可以百度,最好避免在项目中的使用,尤其是敏感的数据。

    本文作者:_未来可期

    本文链接:https://www.cnblogs.com/StarChen20/p/14054692.html

    版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

    阅读全文>>

作者:caibikang分类:【javaEE浏览(187评论(0

2021-02-01 10:47:27