前言:我在做的工程中,一共遇到两个很难解决的问题,因为第一次接触,这两个问题对我来说就是难题了哈哈哈,这两个报错信息
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加密,没有问题。