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

相关文章

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3