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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_34108829/article/details/113353695
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/228113

相关文章

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

SQL 外键Foreign Key全解析

《SQL外键ForeignKey全解析》外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​,外键的值必须匹配另一个表的主键(PrimaryKey)或唯一约束(UniqueCo... 目录1. 什么是外键?​​ ​​​​2. 外键的语法​​​​3. 外键的约束行为​​​​4. 多列外键​

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

Java实现MinIO文件上传的加解密操作

《Java实现MinIO文件上传的加解密操作》在云存储场景中,数据安全是核心需求之一,MinIO作为高性能对象存储服务,支持通过客户端加密(CSE)在数据上传前完成加密,下面我们来看看如何通过Java... 目录一、背景与需求二、技术选型与原理1. 加密方案对比2. 核心算法选择三、完整代码实现1. 加密上

一文教你如何解决Python开发总是import出错的问题

《一文教你如何解决Python开发总是import出错的问题》经常朋友碰到Python开发的过程中import包报错的问题,所以本文将和大家介绍一下可编辑安装(EditableInstall)模式,可... 目录摘要1. 可编辑安装(Editable Install)模式到底在解决什么问题?2. 原理3.

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命

springboot实现配置文件关键信息加解密

《springboot实现配置文件关键信息加解密》在项目配置文件中常常会配置如数据库连接信息,redis连接信息等,连接密码明文配置在配置文件中会很不安全,所以本文就来聊聊如何使用springboot... 目录前言方案实践1、第一种方案2、第二种方案前言在项目配置文件中常常会配置如数据库连接信息、Red

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT