aes iv key 微信_转微信开发(五)微信消息加解密 (EncodingAESKey)

2023-10-17 21:40

本文主要是介绍aes iv key 微信_转微信开发(五)微信消息加解密 (EncodingAESKey),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章作者:松阳

本文出自 阿修罗道,禁止用于商业用途,转载请注明出处。

消息体加密

随着微信服务开发在越来越多的领域应用,应用的安全性逐渐被重视起来。本文主要阐述如何为微信的消息加密的原理与Java版本的实现。

原理

做过微信开发的朋友们都知道,微信使用xml格式的消息结构。这里着重说一下最核心的收发消息。

在明文模式中,POST请求有signature, timestamp, nonce三个参数。它的Body为一个XML:

1348831860

1234567890123456

而在加密模式中,增加了两个参数:encrypt_type 和 msg_signature 。它的Body 也变更为:

其中encryptData是加密后的信息,通过我们在微信开发平台配置的EncodingAESKey, Token, 以及自动生成的AppID,通过加密算法,可以验证信息的真实性,并且将真实的信息,解析成如明文的格式的XML。整条信息是加密的,因此不用担心被伪造,否则,会有风险。

PS:会有怎样的风险?如果是Token被人猜出来进而伪造内容,加密模式中的EncodingAESKey不会么?还是担心消息类型会泄露?没太想明白,希望路过的大神指点

6750d2140b5f2338bd6f7d4717b76188.png

不管怎么说,加密看起来更安全些,我现在做一个金融类的项目,有备无患,就使用了加密的功能。

代码实现

微信提供了一个各种语言的解析,我在上面稍微封装了一下:

public class SignUtil {

/**

*  与开发模式接口配置信息中的Token保持一致

*/

private static String token = "yourToken";

/**

* 微信生成的 ASEKey

*/

private static String encodingAesKey ="yourKey";

/**

* 应用的AppId

*/

private static String appId="yourId";

/**

* 解密微信发过来的密文

*

* @return 加密后的内容

*/

public static String decryptMsg(String msgSignature,String timeStamp,String nonce,String encrypt_msg) {

WXBizMsgCrypt pc;

String result ="";

try {

pc = new WXBizMsgCrypt(token, encodingAesKey, appId);

result = pc.decryptMsg(msgSignature, timeStamp, nonce, encrypt_msg);

} catch (AesException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return result;

}

/**

* 加密给微信的消息内容

* @param replayMsg

* @param timeStamp

* @param nonce

* @return

*/

public static String ecryptMsg(String replayMsg,String timeStamp, String nonce) {

WXBizMsgCrypt pc;

String result ="";

try {

pc = new WXBizMsgCrypt(token, encodingAesKey, appId);

result = pc.encryptMsg(replayMsg, timeStamp, nonce);

} catch (AesException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return result;

}

最后,在对应POST的处理方法中调用:

//request 为请求的 HttpServletRequest 参数

String encrypt_type =request.getParameter("encrypt_type");

if (encrypt_type == null || encrypt_type.equals("raw")) { //不用加密

// 微信加密签名

String signature = request.getParameter("signature");

// 时间戳

String timestamp = request.getParameter("timestamp");

// 随机数

String nonce = request.getParameter("nonce");

if(SignUtil.checkSignature(signature, timestamp, nonce)) {

//业务处理方法,返回为XML格式的结果信息 此处需要转换一下编码,否则中文乱码,不知为何...

String respMessage = new String(wxService.processRequest(request.getInputStream(),session).getBytes("UTF-8"),"ISO8859_1");

logger.info("message:"+respMessage);

return respMessage;

} else {

return "check Error";

}

} else {//需走加解密流程

// 微信加密签名

String msgSignature = request.getParameter("msg_signature");

// 时间戳

String timeStamp = request.getParameter("timestamp");

// 随机数

String nonce = request.getParameter("nonce");

//密文

String encryptMsg = readLine(request.getInputStream());

String data = SignUtil.decryptMsg(msgSignature, timeStamp, nonce, encryptMsg);

logger.info("parse Data is:"+data);

if(data.length() == 0) {

return "CheckError";

} else {

InputStream istream = new ByteArrayInputStream(data.getBytes());

//业务处理方法,返回为XML格式的结果信息

String respMessage = wxService.processRequest(istream,session);

logger.info("message:"+respMessage);

String enRespMsg = SignUtil.ecryptMsg(respMessage, timeStamp, nonce);

return enRespMsg;

}

}

使用上面的方法,可以同时处理明文模式与加密模式,从真正意义上做到闲的蛋疼

7cf6f200b9d851e5b6699599ad696b0f.gif

这篇关于aes iv key 微信_转微信开发(五)微信消息加解密 (EncodingAESKey)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/228113

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD