• Spring Boot Jasypt 3.0.4 报错---算法加解密使用不一致


    大家好,我是神韵,是一个技术&生活博主。出文章目的主要是两个,一是好记忆不如烂笔头,记录总结中提高自己。二是希望我的文章可以帮到大家。欢迎来点赞打卡,你们的行动将是我无限的动力。
    本篇主题是:Spring Boot Jasypt 3.0.4 报错---算法加解密使用不一致

    目录

    场景还原

    错误异常信息

    错误原因结论

    两种解决方案

    感悟


    场景还原

    对yml中的数据库和密码进行密文加密,通过Jasypt技术实现,本文章研究的是Jasypt是3.0版本及以上

    1. spring:
    2. datasource:
    3. # 二、非嵌入式数据库配置--MySQL
    4. driverClassName: com.mysql.cj.jdbc.Driver
    5. url: jdbc:mysql://localhost:3306/jpa?useUnicode=true&useSSL=true&serverTimezone=GMT%2B8
    6. username: ENC(hEc7NPysxK/gIxN1r6iogy/sadZhFkBLLm+gr55CQKC0nBgCSJXEyU9PmsGi1Li3)
    7. password: ENC(MaF3AwPysxK/gIxN1r6iogy/sadZhFkBLLm+gr55CQKC0nBgCSJXEyU9PmsGi1Li3)

    我使用下面代码生成了密文(即加密使用的算法是,PBEWithMD5AndDES-默认),用在yml文件中,jasypt版本是3.0.4。然后启动项目,报上面错误(3.0以上版本默认使用PBEWITHHMACSHA512ANDAES_256算法解密)。

    1. public static void main(String[] args) {
    2. StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
    3. // 默认是PBEWithMD5AndDES加密
    4. // 盐值
    5. standardPBEStringEncryptor.setPassword("salt20220907");
    6. // 加密明文
    7. String encryptValue1 = standardPBEStringEncryptor.encrypt("shenyun");
    8. String encryptValue2 = standardPBEStringEncryptor.encrypt("shenyun20220907");
    9. // 解密密文
    10. String decryptValue = standardPBEStringEncryptor.decrypt("1PcipFvXoDg95eW3ZP1MOw==");
    11. System.out.println(encryptValue1);
    12. System.out.println(encryptValue2);
    13. System.out.println(decryptValue);
    14. }

    错误异常信息

    1. Description:
    2. Failed to bind properties under 'spring.datasource.password' to java.lang.String:
    3. Reason: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'spring.datasource.password' to java.lang.String
    4. Action:
    5. Update your application's configuration

    错误原因结论

    造成这个原因是因为生成密文使用的算法和解密时使用的算法不一致

    • Jasypt 3.0以上版本解密默认都是使用 PBEWITHHMACSHA512ANDAES_256算法
    • Jasypt 3.0以下版本解密默认使用PBEWithMD5AndDES算法

    我们用PBEWithMD5AndDES加密得到的密文,然后在Jasypt 3.0以上使用,3.0以上默认使用PBEWITHHMACSHA512ANDAES_256解密算法,这样子就会造成算法错乱,自然解密失败。

    所以解决这个问题,只需要保证加解密算法一致,这样就可以从其中一个方面入手都行。

    1. 使加密算法与解密算法保持一致,都使用PBEWITHHMACSHA512ANDAES_256算法
    2. 使解密算法与加密算法保持一致,都使用PBEWithMD5AndDES算法

    两种解决方案

    1、使加密算法与解密算法保持一致,都使用PBEWITHHMACSHA512ANDAES_256算法

    使用正确的算法生成密文,然后放到yml上就可以

    1. public static void main1(String[] args) {
    2. PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
    3. SimpleStringPBEConfig config = new SimpleStringPBEConfig();
    4. // 加密方式
    5. config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
    6. // 盐值
    7. config.setPassword("salt20220907");
    8. config.setKeyObtentionIterations("1000");
    9. config.setPoolSize("1");
    10. config.setProviderName("SunJCE");
    11. config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
    12. config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
    13. config.setStringOutputType("base64");
    14. encryptor.setConfig(config);
    15. // 加密明文
    16. String encryptValue1 = encryptor.encrypt("shenyun");
    17. String encryptValue2 = encryptor.encrypt("shenyun20220907");
    18. // 解密密文
    19. // String decryptValue = encryptor.decrypt("MaF3AwiV/aXCCDMEx+nOgAtXreq62JMgRM+2M9NIpUe0vko3fahZ+IxnvocfaGnJ");
    20. System.out.println(encryptValue1);
    21. System.out.println(encryptValue2);
    22. // System.out.println(decryptValue);
    23. }

    2、使解密算法与加密算法保持一致,都使用PBEWithMD5AndDES算法

    解密算法使用PBEWithMD5AndDES与加密算法保持一致

    yml配置加上下面两个配置,缺一不可(password盐是通过vm传入的)

    1. jasypt:
    2. encryptor:
    3. algorithm: PBEWithMD5AndDES
    4. iv-generator-classname: org.jasypt.iv.NoIvGenerator

    当然,你还可以将你的版本降至3.0以下,因为3.0以下默认用的是PBEWithMD5AndDES算法,但是这个和我的研究就对不上套了~

    感悟

    说下感悟,网上的文章认真看了一下,没有一篇是答到点子上,基本上都是抄来抄去,连验证一下估计都觉得累,无语死...

    再次强调结论:造成这个原因是因为生成密文使用的算法和解密时使用的算法不一致。

  • 相关阅读:
    如何使用Net2FTP搭建免费web文件管理器打造个人网盘
    第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第十节 Python——查找字符串中所有重复的字符)
    音视频开发的正确(学习思路+技术指导)
    RTL8720CM WI-FI+蓝牙,低功耗IoT(物联网)应用 40QFN
    【Shell编程】字符截取命令awk、sed命令
    owt-server源码剖析(七)--MCU模式介绍
    用Python爬虫的request方式实现自动签到
    Java并发编程学习十三:final关键字和不变性
    SpringMVC实训内容
    DM8数据库批量创建表,插入数据,更改表信息,删除测试表
  • 原文地址:https://blog.csdn.net/qq_41055045/article/details/126754476