在微信开发时,消息接口时,涉及到消息加密,抛出了 java.security.InvalidKeyException: Illegal key size 的异常,异常堆栈如下:

按照网上的解决方案,都是要求替换JDK目录下两个jar包,

对于一些生产系统 这种方式就不是很方便了,经过探索,发现一种方案,通过反射机制来解决

查看JDK源码,Cihper.checkCryptoPermcheckCryptoPerm,代码如下

    private void checkCryptoPerm(CipherSpi var1, Key var2) throws InvalidKeyException {
if (this.cryptoPerm != CryptoAllPermission.INSTANCE) {
AlgorithmParameterSpec var3;
try {
var3 = this.getAlgorithmParameterSpec(var1.engineGetParameters());
} catch (InvalidParameterSpecException var5) {
throw new InvalidKeyException("Unsupported default algorithm parameters");
} if (!this.passCryptoPermCheck(var1, var2, var3)) {
throw new InvalidKeyException("Illegal key size or default parameters");
}
}
}

其中主要的就是 this.cryptoPerm != CryptoAllPermission.INSTANCE ,找到cryptoPerm初始化的位置,有一个方法

    private void initCryptoPermission() throws NoSuchAlgorithmException {
if (!JceSecurity.isRestricted()) {
this.cryptoPerm = CryptoAllPermission.INSTANCE;
this.exmech = null;
} else {
this.cryptoPerm = getConfiguredPermission(this.transformation);
String var1 = this.cryptoPerm.getExemptionMechanism();
if (var1 != null) {
this.exmech = ExemptionMechanism.getInstance(var1);
} }
}

意思是,如果 JceSecurity.isRestricted() 返回true,则使用CryptoAllPermission.INSTANCE实例 否则需要进行key的校验,因此修改这个方法就行了

isRestricted方法的内容如下:

final class JceSecurity {

private static final boolean isRestricted; //默认情况下为true
static boolean isRestricted() {
return isRestricted;
} }

isRestricted这是一个private static final变量,可通过反射的方式修改

反射修改private field值的方法是

Field field = Class.forName("类名").getDeclaredField("属性名");
field.setAccessible(true);
field.set(null,值); // 如果是static,第一个参数填null,否则填实例对象

由于这个属性的final的,需要对Field.class再反射一次,从modifiers中去掉final属性:

Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

完整的代码:

//解决微信开发时,InvalidKeyException:illegal Key Size的问题

//反射获取isRestrictedfield
Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");

//这个field是 private static final的,需要找到这个field的modifiers,将final去掉,才能修改
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

//修改field
field.setAccessible(true);
field.set(null,false);

执行完整的代码后,加密/解密正常,用微信企业号默认的SDK,测试加密通过

import com.yomahub.liteflow.example.utils.WXBizMsgCrypt;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier; public class Test {
public static void main(String[] args) throws Exception { //解决微信开发时,InvalidKeyException:illegal Key Size的问题 //反射获取isRestrictedfield
Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted"); //这个field是 private static final的,需要找到这个field的modifiers,将final去掉,才能修改
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); //修改field
field.setAccessible(true);
field.set(null,false); String sToken = "QDG6eK";
String sCorpID = "wx5823bf96d3bd56c7";
String sEncodingAESKey = "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C"; WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID); String sRespData = "<xml><ToUserName><![CDATA[mycreate]]></ToUserName><FromUserName><![CDATA[wx5823bf96d3bd56c7]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId><AgentID>128</AgentID></xml>";
String sReqTimeStamp = "1409659813"; String sReqNonce = "1372623149";
String result = wxcpt.EncryptMsg(sRespData,sReqTimeStamp,sReqNonce); System.out.println(result);
}
}

反射解决微信开发加解密illegal key size,不需要修改JDK jar包的更多相关文章

  1. aes加解密 Illegal key size

    做aes加密时,发生一个奇怪的错误,在本地环境是好的,发布到测试环境就出问题, java.security.InvalidKeyException: Illegal key size 想到本地环境之前 ...

  2. java 加密 解密 Illegal key size

    java.security.InvalidKeyException: Illegal key size   今天遇到一个奇怪的问题. 自己做的加签验签功能已经没有问题了,本地测试通过,同事放到服务器上 ...

  3. AES的256位密钥加解密报 java.security.InvalidKeyException: Illegal key size or default parameters 异常的处理及处理工具

    一.出现的现象为了数据代码在传输过程中的安全,很多时候我们都会将要传输的数据进行加密,然后等对方拿到后再解密使用.我们在使用AES加解密的时候,在遇到128位密钥加解密的时候,没有进行什么特殊处理:然 ...

  4. 微信 AES 解密报错 Illegal key size 三种解决办法

    微信 AES 解密报错 Illegal key size Java 环境 java version "1.8.0_151" Java(TM) SE Runtime Environm ...

  5. AES加解密异常java.security.InvalidKeyException: Illegal key size

    AES加解密异常 Java后台AES解密,抛出异常如下:java.security.InvalidKeyException: Illegal key size Illegal key size or ...

  6. 使用delphi+intraweb进行微信开发4—微信消息加解密

    示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. 在上一讲当中我做了个简单的微信文本消 ...

  7. Java企业微信开发_Exception_02_java.security.InvalidKeyException: Illegal key size

    今天换了重新装了一个jdk,然后运行昨天还好好的企业微信工程,结果启动的时候就给我报了这么个错: java.security.InvalidKeyException: Illegal key size ...

  8. Java 解密错误InvalidKeyException: Illegal key size解决方法

    做解密操作,出现如下错误 java.security.InvalidKeyException: Illegal key size // 设置解密模式为AES的CBC模式 Cipher cipher = ...

  9. 微信退款异步通知报错Illegal key size or default parameters 的解决办法

    问题原因: Java几乎各种常用加密算法都能找到对应的实现.因为美国的出口限制,Sun通过权限文件(local_policy.jar.US_export_policy.jar)做了相应限制.因此存在一 ...

随机推荐

  1. Linux服务器上搭建Centos7.0+Apache+php+Mysql网站

    一.安装Linux系统 1.1虚拟机搭建Linux Centos7.0版本,搭建过程省略. 二. 安装apache.php.mysql.php-gd等组件. 2.1安装Apache服务程序(apach ...

  2. djinn

    靶机准备 将靶机ova文件导入虚拟机,并将网络设置为NAT 开机获得ip:192.168.164.188 kali:192.168.164.137 渗透测试 扫描端口 nmap -sS -sV -T5 ...

  3. luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)

    luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...

  4. Linux C++ 实现一个简易版的ping (也就是imcp协议)

    背景: 想实现一个在没外网的时候就自动重启路由器的功能. 又不想用ping命令,因为在代码里调用system("ping"); 可能会比较耗时,得单开线程.于是找了个实现ICMP协 ...

  5. python3 爬虫5--分析Robots协议

    1Robots协议 Robots协议告诉了搜索引擎和爬虫那些页面可以抓取,那些不可以,通常是存放在robots.txt文件里面,位于网站的根目录下 robots.txt中内容的示范: User-age ...

  6. Listener是什么?有什么作用?

    Listener是指Servlet中的监听器. Listener可以对ServletContext对象.HttpSession对象.ServletRequest对象进行监听.

  7. JSBridge通信原理, 有哪几种实现的方式?

    JsBridge给JavaScript提供了调用Native功能,Native也能够操控JavaScript.这样前端部分就可以方便使用地理位置.摄像头以及登录支付等Native能力啦.JSBridg ...

  8. Oracle入门基础(四)一一多行函数

    SQL> --工资总额 SQL> select sum(sal) from emp; SUM(SAL) 29025 SQL> --人数 SQL> select count(*) ...

  9. XMLBeanFactory?

    最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans.该容器从XML 文件读取配置元数据并用它 ...

  10. 学习GlusterFS(七)

    初始环境: 系统环境:centos73.10.0-514.26.2.el7.x86_64 机器数量:两台 硬盘:至少两块,一块为系统盘,另一块留作他用 命名规则:node1 node2 IP规划:19 ...