企微获取会话内容,RSA 解密函数

企微获取会话内容

官方文档:
https://developer.work.weixin.qq.com/document/path/91774

下载SDK

根据自己的环境下载对应的SDK。

企微获取会话内容官方文档

SDK配置

1、sdk中的文件拷贝到项目中
我这里的linux的.so文件,原本是_Java.so那个,我复制了一份去掉了_Java后缀,内容一样的。
在这里插入图片描述
2、Finance文件
在这里插入图片描述
1)注意要放在 指定路径下

package com.tencent.wework;

2)修改Finance文件
将最后的static代码块改成以下代码

static {

        if (isWindows()) {
            String path = Finance.class.getClassLoader().getResource("").getPath() + "\\lib\\qywx\\win\\";
            path = path.replaceAll("%20", " ").replaceFirst("/", "").replace("/", "\\\\");

            //加载顺序不能变
            System.load(path.concat("libcrypto-1_1-x64.dll"));
            System.load(path.concat("libssl-1_1-x64.dll"));
            System.load(path.concat("libcurl-x64.dll"));
            System.load(path.concat("WeWorkFinanceSdk.dll"));

        } else {
            // linux 加载指定so文件在linux系统下的位置
            System.load("/usr/lib/libWeWorkFinanceSdk.so");
            System.loadLibrary("WeWorkFinanceSdk");
        }


    }
    public static boolean isWindows() {
        String osName = System.getProperties().getProperty("os.name");
        return osName.toUpperCase().indexOf("WINDOWS") != -1;
    }

解密过程

参考官方文档案例演示: https://developer.work.weixin.qq.com/document/path/91551

我这里只展示需要自己开发的RSA解密方法,官方文档是这样描述解密过程的:

encrypt_random_key内容解密说明:
encrypt_random_key是使用企业在管理端填写的公钥(使用模值为2048bit的秘钥),采用RSA加密算法进行加密处理后base64
encode的内容,加密内容为企业微信产生。RSA使用PKCS1。 企业通过GetChatData获取到会话数据后:
a) 需首先对每条消息的encrypt_random_key内容进行base64 decode,得到字符串str1.
b) 使用publickey_ver指定版本的私钥,使用RSA PKCS1算法对str1进行解密,得到解密内容str2.
c) 得到str2与对应消息的encrypt_chat_msg,调用下方描述的DecryptData接口,即可获得消息明文。

:需要注意的是,如果你用的json处理库会把+号自动转换为空格,要手动转换回来,不然会出错。

String encryptRandomKey = jsonObject.getString("encrypt_random_key");
encryptRandomKey = encryptRandomKey.replace(" ", "+");

比如说com.alibaba.fastjson.JSONObject

解密代码参考

String data = this.decodeWeworkData(encryptRandomKey);//解密
long msg = Finance.NewSlice();
int decryptDataReturn = Finance.DecryptData(sdk, data, encryptChatMsg, msg);//调用企微sdk获取消息明文msg
String decryDataMsg = Finance.GetContentFromSlice(msg);//消息明文,json格式
Finance.FreeSlice(msg);//释放

:最后decryDataMsg 就是解密后的消息明文。
下面是具体的解密方法

public String decodeWeworkData(String chatData) {
        //解密
        String str = null;
        try {
            str = getPrivateKeyByPKCS1(chatData, priKey);
        } catch (Exception e) {
            System.out.println("解密错误");
            e.printStackTrace();
        }
        return str;
    }
public static String getPrivateKeyByPKCS1(String encrypt_random_key,String privKeyPEM) throws Exception {
        String privKeyPEMnew = privKeyPEM.replaceAll("\\n", "").replace("-----BEGIN RSA PRIVATE KEY-----", "").replace("-----END RSA PRIVATE KEY-----", "");
        byte[] bytes = java.util.Base64.getDecoder().decode(privKeyPEMnew);
        DerInputStream derReader = new DerInputStream(bytes);
        DerValue[] seq = derReader.getSequence(0);
        BigInteger modulus = seq[1].getBigInteger();
        BigInteger publicExp = seq[2].getBigInteger();
        BigInteger privateExp = seq[3].getBigInteger();
        BigInteger prime1 = seq[4].getBigInteger();
        BigInteger prime2 = seq[5].getBigInteger();
        BigInteger exp1 = seq[6].getBigInteger();
        BigInteger exp2 = seq[7].getBigInteger();
        BigInteger crtCoef = seq[8].getBigInteger();

        RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
        // 64位解码加密后的字符串
        byte[] inputByte = Base64.decodeBase64(encrypt_random_key.getBytes("UTF-8"));
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        //RSA解密
        String outStr = new String(cipher.doFinal(inputByte));
        return outStr;
    }

其中priKey是私钥,我是直接写在了代码里了,参考案例演示
在这里插入图片描述

:RSA使用PKCS1,模值为2048bit

2025.07.15补充:
pom文件要加上两个依赖

		<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpg-jdk16</artifactId>
            <version>1.46</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>1.64</version>
        </dependency>

SDK文件上传到服务器

例如使用Docker部署,添加如下代码至Dockerfile,

COPY src/main/resources/lib/qywx/linux/libWeWorkFinanceSdk.so /usr/lib/libWeWorkFinanceSdk.so

最后

希望对你有所帮助,有疑问和错误欢迎讨论和指正。

HOOK技术框架与微信平台数据交互机制研究 本技术文档系统阐述基于HOOK机制的微信客户端数据捕获与处理方案,涵盖个人微信及企业微信双平台。该框架通过底层系统拦截技术,实现对微信客户端通信协议的实时解析与数据重组,具备结构化信息提取能力。 在微信公众号数据采集方面,该技术方案采用非侵入式数据捕获模式,通过内存读取与协议解析相结合的方式,获取公众号文章元数据、用户交互数据及内容传播数据。所有采集过程均在本地完成,不依赖第三方服务器中转。 企业级应用模块特别设计了分布式架构支持,可同时管理多个企业微信实例的数据流。系统采用模块化加密存储方案,所有捕获数据均经过多层加密处理,确保数据在存储与传输过程中的完整性与保密性。 技术实现层面包含以下核心组件:动态链接库注入引擎、实时数据过滤管道、结构化数据转换器以及异常处理机制。每个组件均采用独立线程运行模式,确保系统在高并发场景下的稳定性与响应效率。 该框架严格遵循本地化处理原则,所有数据解析与重组操作均在用户终端设备完成,不涉及远程服务器数据传输。系统提供完整的日志记录与审计功能,所有数据操作均可追溯验证。 注意事项:本技术文档所述方案仅限用于符合相关法律法规的技术研究场景,使用者应确保其应用行为符合《网络安全法》《个人信息保护法》等现行法律法规要求。任何数据采集行为必须获得相应授权,且不得用于侵害他人合法权益的用途。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值