起因:今天项目上线,上线后监测日志,发现由异常,开始查找问题 ,进而引发了“血案”
线上日志报错如下:Illegal key size
画外音:看到线上项目出现问题心里慌的一批
赶紧扒拉出代码,一行一行对着报错日志查看,最后定位到
AES aes = new AES(appSecret.getBytes());
AES解密时报错,一开始想着解密的密钥错误,去运维那边查找密钥发现正常无误。
AES解密方法用的是同事封装的jar包,想着是不是同事jar里面有问题。
我说: 帮忙看下这个错误吧
同事说: 密钥错误吧
我说: 密钥正确
同事说:应该是jdk有问题,线上服务器替换jar包了吗?
我:(懵逼状)jar包?
同事说:都知道,全部人都发过,需要替换jre里面的local_policy.jar和US_export_policy.jar两个jar包,jar包也都发过
我:没给我发过,也没通知过我
同事1: 不可能,都发过,jar包带说明
我说:真没有。(并在本地磁盘与钉钉聊天中搜索,无结果)
我说:先去运维那把服务器上的替换了,先把线上问题解决吧(咚咚咚~~跑到运维那)
同事2: 你竟然不知道,不可能,我印象中还给你看过呢
我:真的没有,你们四五个人都私下里说了,也私下发包了,但是就没给我说啊(此时已经哭晕在厕所,就瞒着我一人)
同事2:就给你说过
我:啊啊,太气了,真的没有,发誓没有
同事2:算了,算了,也不重要
我:重要。(太想揍人了,好生气好生气!)
咋能不重要,都说我知道,给我说过,结果我真不知道,主要是,大家咬定给我说过,jar也给我发过,没发过本地肯定运行不了 。可我真没有收到啊啊啊啊~ 本地也真的能够运行啊
就我这暴脾气,忍不了啊。。。我到底要看看local_policy.jar和US_export_policy.jar这两个是个啥玩意。
查找到原因:
这是因为某些国家的进口管制限制,JDK默认的加解密有一定的限制。
比如默认不允许 256 位密钥的 AES 加解密,解决方法就下载官方JCE无限制强度加密策略文件,覆盖即可。
但是发现我用的1.8.0_171 版本的 $JAVA_HOME/jre/lib/security/ 目录下面多了一个 policy 文件夹,里面还有两个文件夹
├── limited
│ ├── local_policy.jar
│ └── US_export_policy.jar
└── unlimited
├── local_policy.jar
└── US_export_policy.jar
于是搜了一下,发现
从Java 1.8.0_151和1.8.0_152开始,为JVM启用 无限制强度管辖策略 有了一种新的更简单的方法。如果不启用此功能,则不能使用AES-256。
请在 jre/lib/security 文件夹中查找文件 java.security。
例如,对于Java 1.8.0_152,文件结构如下所示:
/jdk1.8.0_152
|- /jre
|- /lib
|- /security
|- java.security
现在用文本编辑器打开java.security,并找到定义java安全性属性crypto.policy的行,它可以有两个值limited或unlimited - 默认值是limited。
默认情况下,应该能找到一条注释掉的行:
#crypto.policy=unlimited
可以取消注释该行来启用无限制,删除
#:crypto.policy=unlimited
我的老天,人家版本默认支持,你们就是没给姐姐说,还诬赖我,让我哭会儿吧