反射解决微信开发加解密illegal key size,不需要修改JDK jar包

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

反射解决微信开发加解密illegal key size,不需要修改JDK jar包

按照网上的解决方案,都是要求替换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的问题//反射获取isRestrictedfieldField 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);//修改fieldfield.setAccessible(true);field.set(null,false);

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

反射解决微信开发加解密illegal key size,不需要修改JDK jar包
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 = "13488318601234567890123456128";
        String sReqTimeStamp = "1409659813";

        String sReqNonce = "1372623149";
        String result = wxcpt.EncryptMsg(sRespData,sReqTimeStamp,sReqNonce);

        System.out.println(result);
    }
}

View Code

Original: https://www.cnblogs.com/xcr1234/p/15451907.html
Author:  
Title: 反射解决微信开发加解密illegal key size,不需要修改JDK jar包

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622026/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Lua 面向对象的实现

    面向对象三大特性 封装 继承 多态 Lua的面向对象 Lua语言本身并不是为了面向对象而设计,但是可以通过Lua的 table、 metatable等语言特性来实现面向对象。通过将…

    数据结构和算法 2023年6月12日
    066
  • 简介

    STL简介 C++ STL(Standard Template Libiary标准模板库)是通用类模板和算法的集合,它提供了一些标准的数据结构的实现,如queues(队列),lis…

    数据结构和算法 2023年6月13日
    082
  • LOJ数列分块 9 题解

    (1.) 题意 给定一个长度 (n) 序列,每次查询区间 (l, r) 的众数。 (2.) 思路 如果边界是 ([l,r]),(l) 在第 (a) 块,(r) 在第 (b) 块,可…

    数据结构和算法 2023年6月12日
    0101
  • C++ 炼气期之数据是主角

    1. 前言 数据在程序中的重要性,怎么强调都不为过,程序的本质就是通过提供数据处理逻辑,把数据从一种状态变成另一种状态的过程。处理逻辑一定是有针对性的,针对的是数据本身的特性。 只…

    数据结构和算法 2023年6月7日
    083
  • Linux学习笔记

    写在最开始! 我的云服务器是阿里云的 2核4G ECS 上行带宽为1M 下行带宽不受限 硬盘容量40G 准备工作 首先我们要确保自己的云服务器系统版本为 centos7 确认安装了…

    数据结构和算法 2023年6月12日
    084
  • 异或的用法

    异或的性质1.异或的本质是 无进位相加->相同为0,不同为12.异或的性质 a^a=0, a^0=a 以及交换律,结合率 异或的新用法:1.不占用额外空间的交换位置a a=a…

    数据结构和算法 2023年6月7日
    088
  • DP 做题记录

    (Problem:)你有 (A) 枚正能量骰子,(6) 个面分别显示的是 ([+1, +6]) 的值。你有 (B) 枚负能量骰子,(6) 个面分别显示的是 ([-6, -1]) 的…

    数据结构和算法 2023年6月12日
    075
  • 力扣12. 整数转罗马数字

    12. 整数转罗马数字 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X…

    数据结构和算法 2023年6月16日
    088
  • 使用JMeter进行性能测试(压力测试)

    一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试,他可以帮助我们发现系统中的瓶颈问题,减少发布到生产环境后出问题的几率;预估系统的承载能力,使我们能根据其做出一些…

    数据结构和算法 2023年6月12日
    090
  • Html飞机大战(九): 使徒来袭 (设计敌机)

    好家伙,本篇介绍敌机 好了,按照惯例我们来理一下思路: 我们有一个敌机类,第一步当然是实例一个敌机对象, 然后我们把这个敌机放入我们的敌机群(敌机数组) 然后是熟悉的移动和绘制 那…

    数据结构和算法 2023年6月12日
    078
  • 【模板】负环(SPFA/Bellman-Ford)/洛谷P3385

    题目链接 https://www.luogu.com.cn/problem/P3385 题目大意 给定一个 (n) 个点有向点权图,求是否存在从 (1) 点出发能到达的负环。 题目…

    数据结构和算法 2023年6月7日
    0123
  • LRU和LFU的实现

    LFU和 LRU是两种典型的缓存页面置换算法,了解其底层以及运行机制是CSer的必修课。 缓存是计算机中广泛应用的一种技术,包括CPU L1/L2/L3 cache,RAM中的ca…

    数据结构和算法 2023年6月8日
    0103
  • Educational DP Contest 社论

    SoyTony 让我放歌词: Wish You Were Gay SoyTony 不让我放中文歌词, 《Wish You Were Gay》Baby, I don’t …

    数据结构和算法 2023年6月7日
    070
  • P2517 [HAOI2010]订货

    简要题意 一家公司销售一种商品,在时刻 (i) 可以需要 (U_i) 份商品。第 (i) 时刻向生产方购买 (1) 份商品需要 (d_i) 的代价。(i-1) 时刻的 (1) 份商…

    数据结构和算法 2023年6月12日
    072
  • [总结]2022-2-9

    春节后第一场比赛,状态不好。 P1心路历程 看到T1马上想到了勾股定理,但没有很好的做法。T2认为是比较好拿部分分的,T3认为可以转化为树形dp来做,但确实不可以。T4也实在没有什…

    数据结构和算法 2023年6月8日
    087
  • AtCoder ABC 270 题解(D-F)

    ​ 现在有一堆石子,一个序列a表示每次可以从石头里拿走多少个石子。当无法再拿出石头的时候,游戏结束。两边都以最佳策略游玩,请问先手者最多能拿走几个石子。 ​ 对于这种两边都采取最佳…

    数据结构和算法 2023年6月12日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球