2020-09-16 Jasypt 数据库密码 加密解密踩的坑 Spring-Boot + Jasypt

前言:我在做的工程中,一共遇到两个很难解决的问题,因为第一次接触,这两个问题对我来说就是难题了哈哈哈,这两个报错信息

java.lang.IllegalArgumentException: Password cannot be set empty

org.jasypt.exceptions.EncryptionOperationNotPossibleException

后面我会有写到什么情况下会有这样的报错。

实践:

1.先加jasypt依赖

<dependency>
   <groupId>com.github.ulisesbocchio</groupId>
   <artifactId>jasypt-spring-boot-starter</artifactId>
   <version>2.0.0</version>
</dependency>

2.在 application.yml中配置(在这之前要先设置密文!!!!请往下看)

这里的 “salt” 是自己定义的,千万不要模范别人博客里面写的什么demo,salt,其他字符等等,因为这个是自己设置的,你自己想怎么起名字就怎么起名字,但前提是!!!!你要先配置一下!!!!不然就会一直报下面的错误:

java.lang.IllegalArgumentException: Password cannot be set empty

报了这个错之后,你就开始找问题出现在哪里,你找啊找,死活也找不到到底是哪里出了问题,就是因为你抄了别人的密文,切记!!!!这里一定自己设置,生成自己的密文,所以第二步应该是设置密文,设置方法如下:

添加jasypt依赖后,到自己本地maven仓库,jasypt.jar所在的目录下,我这里的目录是这样的,

然后在此目录下,git bash here,(或者cmd)

java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=salt algorithm=PBEWithMD5AndDES

java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=salt algorithm=PBEWithMD5AndDES

这里的input,是你要加密的字段,(我这里假设用户名是root)

password,是混淆密钥,也就是盐值,用来进行加密

algorithm,是加密方式,默认写我这个就ok

然后会有一个OUTPUT输出,内容就是用户名root对应的加密后的密码

这步完成之后,再在application.yml中加入jasypt配置

这里的 salt 可以随便配,执行 这个 java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=salt algorithm=PBEWithMD5AndDES 命令的时候,password=“” 的值,就是你在application.yml配置的password的值,要保持一致!!!我这里其实有个问题,当我再执行一遍这个命令的时候,我把password的值换一个,然后我application,yml中还用salt,好像也是可以的,我猜可能是因为之前已经有设置过salt的原因了?这个我还不是太清楚,但设置的时候保持一致就ok的。

------------------------

我这里写了个测试方法,用来测我配置的jasypt加解密是否正常运行:

@Test
    public void encrypt(){
    //加密方法
        System.out.println(stringEncryptor.encrypt("root"));
        //解密方法
        System.out.println(stringEncryptor.decrypt("E6FPYjsOl/SUBCuDn9Z4Xg=="));
//        System.out.println(stringEncryptor.decrypt("oKBQENfbbQiMyPvECAgPGA=="));
    }

这个测试方法,我第一次跑的时候,是第一行就报错了,java.lang.IllegalArgumentException: Password cannot be set empty

我一直以为是加密的问题,后来才发现,就是我application.yml中的password配置的问题,上面我也特别强调了注意的点!!!!

上面问题解决之后,再跑解密的时候,又报错了:

org.jasypt.exceptions.EncryptionOperationNotPossibleException

这个要怎么解决呢,我搜了好几个博文,都没有找到正确的办法,有人说要注释掉 datasource里面的password,根本行不通好不啦,注=注释掉密码还怎么连接数据库啊,还有人说是什么的我忘记了,其实是因为!!!!!要解密的字符串不是有效的加密字符串!!!!!这个错误就是因为,又又又抄了别人的代码。。。笑哭

所以你要想测试解密这里的字符串,一定是要你先跑加密方法,生成一串字符,然后你再对这串字符进行解密,不然就会报错了哦,绞尽脑汁,怀疑人生哈哈哈哈

最后:

有人说还要在项目上加注解@EnableEncryptableProperties 才能生效

但我没加,好像也生效了,有人说 你的springboot应用使用了@SpringBootApplication 跟加 @EnableEncryptableProperties 注解效果一样,maybe吧,这个我也不是很清楚,我springboot项目,启动类上 只加的 @SpringBootApplication,用的jasypt加密,没有问题。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值