背景
最近被拉去一个新项目组, 他们用的jasypt加密方式为数据库信息加密
我拉取代码后一跑,果然报错了
Unable to decrypt: ENC(xxxx)
在试了n中方法, 包括:
- 创建新项目使用jasypt复现
- 写demo直接用jasypt的类加解密
- debug看源码执行的过程
- 换open jdk的版本
- 在jre的包下替换java-security的两个文件
都失败了
原因
简单说就是大概率使用的jdk版本对于加解密256有限制, 支持的是128位的加解密
1.JDK中包含有JRE(Java Runtime Environment,即:Java运行环境),JRE中包括Java虚拟机(Java Virtual Machine)、Java核心类库和支持文件,而我们今天要说的主角就在Java的核心类库中。在Java的核心类库中有一个JCE(Java Cryptography Extension),JCE是一组包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现,所以这个是实现加密解密的重要类库。
2.在我们安装的JRE目录下有这样一个文件夹:%JAVE_HOME%\jre\lib\security(%JAVE_HOME%是自己电脑的Java路径,),其中包含有两个.jar文件:“local_policy.jar ”和“US_export_policy.jar”,也就是我们平时说的jar包,这两个jar包就是我们JCE中的核心类库了。JRE中自带的“local_policy.jar ”和“US_export_policy.jar”是支持128位密钥的加密算法,而当我们要使用256位密钥算法的时候,已经超出它的范围,无法支持,所以才会报:“java.security.InvalidKeyException: Illegal key size or default parameters”的异常。
3.AES加解密时,会使用到Java.security.*包,即jdk security,其中使用的jar包%JAVA_HOME%/jre/lib/security/local_policy.jar和%JAVA_HOME%/jre/lib/security/US_export_policy.jar有对技术出口的限制(因为美国的出口限制,Sun通过权限文件local_policy.jar、US_export_policy.jar做了相关限制),加密只有128bit,而没有限制的则有256bit。
参考来源 https://blog.csdn.net/weixin_46030885/article/details/109311131
https://blog.csdn.net/xiaopangcame/article/details/128003074
结论
换其他版本的jdk有奇效
国内镜像地址 https://www.injdk.cn/
我选择的是亚马逊的这个, Corretto. 其他的没试