企微获取会话内容,RSA 解密函数
企微获取会话内容,RSA 解密函数
- 企微获取会话内容
- 下载SDK
- SDK配置
- 解密过程
- 解密代码参考
- SDK文件上传到服务器
- 最后
企微获取会话内容
官方文档:
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
SDK文件上传到服务器
例如使用Docker部署,添加如下代码至Dockerfile,
COPY src/main/resources/lib/qywx/linux/libWeWorkFinanceSdk.so /usr/lib/libWeWorkFinanceSdk.so
最后
希望对你有所帮助,有疑问和错误欢迎讨论和指正。
相关文章:

企微获取会话内容,RSA 解密函数
企微获取会话内容,RSA 解密函数 企微获取会话内容下载SDKSDK配置解密过程解密代码参考SDK文件上传到服务器最后 企微获取会话内容 官方文档: https://developer.work.weixin.qq.com/document/path/91774 下载SDK 根据自己的环境下载对应的SDK。 SDK配置…...

MyBatis入门:快速搭建数据库操作框架 + 增删改查(CRUD)
一、创建Mybatis的项目 Mybatis 是⼀个持久层框架, 具体的数据存储和数据操作还是在MySQL中操作的, 所以需要添加MySQL驱动 1.添加依赖 或者 手动添加依赖 <!--Mybatis 依赖包--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactI…...

离线安装Microsoft 照片【笔记】
实验环境为:Windows 10 企业版 LTSC。 1.下载好相关离线依赖包和安装包。 2.管理员身份运行powershell,输入以下命令行: Add-AppPackage .\Microsoft.UI.Xaml.2.4_2.42007.9001.0_x64__8wekyb3d8bbwe.Appx Add-AppPackage .\Microsoft.NET…...
地理卷积神经网络加权回归模型的详细实现方案
以下为地理卷积神经网络加权回归模型的详细实现方案。由于篇幅限制,代码和说明将分模块呈现。 地理卷积神经网络加权回归模型实现 目录 理论基础数据预处理模型架构设计空间权重矩阵生成混合模型实现实验与结果分析优化与扩展结论一、理论基础 1.1 地理加权回归(GWR) 地理…...

【后端高阶面经:Elasticsearch篇】39、Elasticsearch 查询性能优化:分页、冷热分离与 JVM 调优
一、索引设计优化:构建高效查询的基石 (一)分片与副本的黄金配置 1. 分片数量计算模型 # 分片数计算公式(单分片建议30-50GB) def calculate_shards(total_data_gb, single_shard_gb=30):return max...
光伏电站及时巡检:守护清洁能源的“生命线”
在“双碳”目标驱动下,光伏电站作为清洁能源的主力军,正以年均20%以上的装机增速重塑全球能源格局。然而,这些遍布荒漠、屋顶的“光伏矩阵”并非一劳永逸的能源提款机,其稳定运行高度依赖精细化的巡检维护。山东枣庄触电事故、衢州…...

基于 ZU49DR FPGA 的无线电射频数据采样转换开发平台核心板
无线电射频数据采样转换开发板及配套开发平台的核心板,该SOM核心板是一个最小系统,包括AMD公司的 Zynq UltraScale RFSOC 第3代系列XCZU49DR-2FFVF1760I FPGA、时钟、电源、内存以及 Flash。与其配套的底板是标准的全高全长Gen4.0 x8的PCIE卡,…...

软考 系统架构设计师系列知识点之杂项集萃(69)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(68) 第114题 若对关系R(A,B,C,D)和S(C,D,E)进行关系代数运算,则表达式 与()等价。 A.…...
从源码编译支持ffmpeg(H264编码)的opencv(创建mp4视频报错:H264 is not supported with codec id 28)
目录 步骤 1:安装 FFmpeg 在 Ubuntu 上安装 FFmpeg 在 Windows 上安装 FFmpeg 验证FFmpeg是否支持H264编码 步骤 3:克隆 OpenCV 源码 步骤 4:编译 步骤 5:验证安装 本人的配置如下: 系统:Ubuntu 18…...

leetcode 83和84 Remove Duplicates from Sorted List 和leetcode 1836
目录 83. Remove Duplicates from Sorted List 82. Remove Duplicates from Sorted List II 1836. Remove Duplicates From an Unsorted Linked List 删除链表中的结点合集 83. Remove Duplicates from Sorted List 代码: /*** Definition for singly-linked l…...
每日leetcode(昨天赶飞机没做,今天补)
896. 单调数列 - 力扣(LeetCode) 题目 如果数组是单调递增或单调递减的,那么它是 单调 的。 如果对于所有 i < j,nums[i] < nums[j],那么数组 nums 是单调递增的。 如果对于所有 i < j,nums[i]…...
SDL2常用函数:SDL_BlitSurfaceSDL_UpdateWindowSurface 数据结构及使用介绍
SDL_BlitSurface SDL_BlitSurface 是 SDL 1.2/2.0 中都存在的函数,用于将一个表面(Surface)的内容复制到另一个表面,支持部分复制、格式转换和简单的混合操作。 核心功能 表面复制:将源表面的像素数据复制到目标表面区域选择:可…...

【LeetCode 热题 100】买卖股票的最佳时机 / 跳跃游戏 / 划分字母区间
⭐️个人主页:小羊 ⭐️所属专栏:LeetCode 热题 100 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 买卖股票的最佳时机跳跃游戏跳跃游戏 II划分字母区间 买卖股票的最佳时机 买卖股票的最佳时机 class Solution { pu…...

万亿参数背后的算力密码:大模型训练的分布式架构与自动化运维全解析
目录 一、技术融合的时代背景 二、深度学习在 AI 大模型中的核心作用 2.1 预训练与微调机制 2.2 多模态深度学习的突破 三、分布式计算:大模型训练的基础设施 3.1 分布式训练核心原理 3.2 数据并行实战(PyTorch DDP) 3.3 模型并行与混…...
LangChain03-图数据库与LangGraph
图数据库与LangGraph集成实践 1. 引言 在构建智能问答系统、推荐引擎或复杂决策流程时,传统的关系型数据库和向量数据库往往难以满足对实体关系建模和多跳推理的需求。图数据库(如 Neo4j、TigerGraph)通过节点-边-属性的结构化表示ÿ…...
rabbitmq单机多实例部署
RabbitMQ 单实例部署 单实例部署是指在一台服务器上运行一个 RabbitMQ 实例。这种部署方式适用于小型应用或开发环境,配置简单,资源占用较少。单实例部署的核心是安装 RabbitMQ 并启动服务,通常需要配置 Erlang 环境,因为 RabbitMQ 是基于 Erlang 编写的。单实例部署的优势…...

Linux10正式版发布,拥抱AI了!
📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...

在离线 OpenEuler-22.03 服务器上升级 OpenSSH 的完整指南
当然可以!以下是一篇结构清晰、语言通俗易懂的技术博客草稿,供你参考和使用: 在离线 OpenEuler-22.03 服务器上升级 OpenSSH 的完整指南 背景介绍 最近在对一台内网的 OpenEuler-22.03 服务器进行安全扫描时,发现其 SSH 版本存在…...

全能邮箱全能邮箱:实现邮件管理的自动化!
全能邮箱全能邮箱:实现邮件管理的自动化! 全能邮箱全能邮箱的配置教程?如何注册烽火域名邮箱? 全能邮箱全能邮箱作为一种创新的邮件管理解决方案,正逐渐改变我们处理邮件的方式。蜂邮EDM将围绕全能邮箱全能邮箱&…...
[特殊字符] Linux 日志查看与分析常用命令全攻略
在日常运维与开发排查中,我们经常需要查看服务日志来定位问题。本文系统整理了几种常用的日志查看命令,包括 tail、cat、grep、split、sed 等,并结合实际应用场景,提供了完整的使用方式和示例。 📌 一、tail 命令 ——…...

mysql-tpcc-mysql压测工具使用
在Linux系统上安装和配置tpcc-mysql进行MySQL的TPC-C基准测试,通常涉及以下几个步骤。请注意,由于tpcc-mysql不是一个官方工具,它可能需要从第三方仓库获取,如Percona提供的版本。 前置条件 确保MySQL或MariaDB已安装࿱…...

Qt找不到windows API报错:error: LNK2019: 无法解析的外部符号 __imp_OpenClipboard
笔者在开发中出现的bug完整报错如下: spcm_ostools_win.obj:-1: error: LNK2019: 无法解析的外部符号 __imp_OpenClipboard,函数 "void __cdecl spcmdrv::vCopyToClipboard(char const *,unsigned __int64)" (?vCopyToClipboardspcmdrvYAXPE…...
机试 | vector/array Minimum Glutton C++
题目地址 : C - Minimum Glutton #include<stdio.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() {//N:菜肴数,X:总甜度阈值,Y:总咸度阈值int…...

OpenCv高阶(十七)——dlib库安装、dlib人脸检测
文章目录 前言一、dlib库简介二、dlib库安装1、本地安装(离线)2、线上安装 三、dlib人脸检测原理1、HOG 特征提取2、 SVM 分类器训练3、 滑动窗口搜索4、非极大值抑制(NMS) 四、dlib人脸检测代码1、导入OpenCV计算机视觉库和dlib机…...

前端内容黑白处理、轮播图、奇妙的头像特效
1、内容黑白处理 (1)filter:滤镜 可以把包裹的区域中每一个像素点,经过固定的算法转换成另一种颜色来呈现 (2)grayscale:灰阶滤镜 取值范围:0~1取0:原图去1ÿ…...
蓝桥杯 10. 安全序列
当然可以,以下是整理后的 Markdown 格式题目描述: 题目描述 小蓝是工厂里的安全工程师,他负责安放工厂里的危险品。 工厂是一条直线,直线上有 n 个空位,小蓝需要将若干个油桶放置在这 n 个空位上。每 2 个油桶中间至…...
(10)-java+ selenium->元素之By class name
1.简介 继续介绍WebDriver关于元素定位大法,这篇介绍By ClassName。看到ID,NAME这些方法的讲解,应该知道,要做好Web自动化测试,最好是需要了解一些前端的基本知识。有了前端知识,做元素定位会很轻松,同样写网络爬虫也很有帮助 2.常用定位方法(8种) (1)id (2)nam…...

Git - .gitignore 文件
一、.gitignore 文件介绍 在使用 Git 进行版本控制时,.gitignore 文件是一个非常重要的配置文件,用于告诉 Git 哪些文件或目录不需要被追踪和提交到版本库中。合理使用 .gitignore 文件可以避免提交不必要的文件,如临时文件、编译生成的文件…...
MPI与多线程(如OpenMP)混合编程注意事项与性能优化
文章目录 MPI与多线程(如OpenMP)混合编程注意事项与性能优化混合编程注意事项性能优化策略示例代码编译与运行性能调优建议 MPI与多线程(如OpenMP)混合编程注意事项与性能优化 混合编程注意事项 MPI初始化与线程支持级别: 需要在MPI_Init之前调用MPI_Init_thread指…...
计算机网络学习(八)——MAC
一、MAC 在计算机网络中,MAC(Media Access Control,媒体访问控制)地址是数据链路层的重要概念,它用于唯一标识网络中的设备,并且在局域网(如以太网)中发挥关键作用。 MAC 是硬件地址…...