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

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

mybatis用拦截器实现字段加解密全过程

《mybatis用拦截器实现字段加解密全过程》本文通过自定义注解和MyBatis拦截器实现敏感信息加密,处理Parameter和ResultSet,确保数据库存储安全且查询结果解密可用... 目录前言拦截器的使用总结前言根据公司业务需要,灵活对客户敏感信息进行加解密,这里采用myBATis拦截器进行简单实

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配