原文:微信消息体签名及加解密功能详细解析以及.net实现

前言

微信消息体签名及加密功能已上线,明文传输确实存在安全风险,鉴于微信的用户范围使用之广泛,必定会成为众矢之的。所以大家还是尽快接入安全模式为好。仔细阅读官方接入指南,发现这次安全升级只是涉及到用户在微信对话窗口中与公众好消息交互,所以此次升级还是比较简单的。下面为大家一一道来。

一、功能解析

微信消息体签名及加密功能已上线,出于安全考虑,强烈建议您尽快接入消息加密功能,消除安全风险。详见公告。公众平台接口调试工具已经全面支持消息体加密功能的在线调试,可以在http://mp.weixin.qq.com/debug,“接口类型”选择消息接口调试,并在“加密调试”选择兼容模式或者安全模式,在线调试消息体加解密功能。

目前,公众平台推送给公众账号的基础消息和公众账号回复的响应消息存在一定程度的安全风险,为了更好的保护用户和公众账号的信息安全,公众平台将对信息安全进行升级,升级内容如下:
1. 新增消息体签名验证,用于公众平台和公众账号验证消息体正确性
2. 针对推送给微信公众账号的普通消息和事件消息,以及推送给设备公众账号的设备消息进行加密
3. 公众账号对密文消息的回复也要求加密

也就是说在安全模式下,服务器要对用户回复的消息进行解密,对公众号回复给用户的消息需要加密

公众号直接调用微信服务器的接口除外,因为已经全部使用https协议。

我们官方demo(Deepleo.Web项目就是demo),里面 Controllers/WeixinController 就是接受用户消息并回复消息。
二、公众号接入步骤
 
1.下载C#版本的官方加密解密文件。
  这部分我已经下载到SDK中,大家不用理会。详见:https://github.com/night-king/we ... in.SDK/Cryptography
2.修改WeixinController的Post方法
在安全模式下,微信服务器POST过来的request只是增加了2个参数,encrypt_typemsg_signature(注意不是signature)所以修改起来相对简单。
encrypt_type=aes时,表示微信已经为公众号启用安全模式了。msg_signature是微信给予我们用于的解密签名串,仅仅用于解密,加密不需要msg_signature。
下面的代码就顺理成章啦。
 
     /// <summary>
/// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
/// 完整版:https://github.com/night-king/we ... WeixinController.cs
/// </summary>
[HttpPost]
[ActionName("Index")]
public ActionResult Post(string signature, string timestamp, string nonce, string echostr)
{
WeixinMessage message = null;
var safeMode = Request.QueryString.Get("encrypt_type") == "aes";
using (var streamReader = new StreamReader(Request.InputStream))
{
var decryptMsg = string.Empty;
var msg = streamReader.ReadToEnd(); #region 解密
if (safeMode)
{
var msg_signature = Request.QueryString.Get("msg_signature");
var wxBizMsgCrypt = new WXBizMsgCrypt(WeixinConfig.Token, WeixinConfig.EncodingAESKey, WeixinConfig.AppID);
var ret = wxBizMsgCrypt.DecryptMsg(msg_signature, timestamp, nonce, msg, ref decryptMsg);
if (ret != 0)//解密失败
{
//TODO:开发者解密失败的业务处理逻辑
//注意:本demo用log4net记录此信息,你可以用其他方法
LogWriter.Default.WriteError(string.Format("decrypt message return {0}, request body {1}", ret, msg));
}
}
else
{
decryptMsg = msg;
}
#endregion message = AcceptMessageAPI.Parse(decryptMsg);
}
var response = new WeixinExecutor().Execute(message);
var encryptMsg = string.Empty; #region 加密
if (safeMode)
{
var msg_signature = Request.QueryString.Get("msg_signature");
var wxBizMsgCrypt = new WXBizMsgCrypt(WeixinConfig.Token, WeixinConfig.EncodingAESKey, WeixinConfig.AppID);
var ret = wxBizMsgCrypt.EncryptMsg(response, timestamp, nonce, ref encryptMsg);
if (ret != 0)//加密失败
{
//TODO:开发者加密失败的业务处理逻辑
LogWriter.Default.WriteError(string.Format("encrypt message return {0}, response body {1}", ret, response));
}
}
else
{
encryptMsg = response;
}
#endregion return new ContentResult
{
Content = encryptMsg,
ContentType = "text/xml",
ContentEncoding = System.Text.UTF8Encoding.UTF8
};
}

注意:WXBizMsgCrypt为官方提供的C#版本的AES加密解密类,你可以在这里下载这些文件

详见:https://github.com/night-king/we ... WeixinController.cs

3.微信公众平台后台设置
登录微信公众平台后台,点击开发者中心,修改“消息加密方式”为“安全模式”。
因为兼容模式传输的消息体为明文模式的3倍,安全模式和明文模式不相上下,所以我个人不建议使用兼容模式,官方弄个兼容模式也是给大家平滑安全的从明文模式过渡到安全模式用的。
这里还需要设置EncodingAESKey,也就是AES算法的加解密密钥。然后保存即可。
 
 

微信消息体签名及加解密功能详细解析以及.net实现的更多相关文章

  1. C#微信公众号开发系列教程三(消息体签名及加解密)

    http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...

  2. 微信消息体加解密及EncodingAESKey

    公众平台消息体签名及加解密方案概述 1.新增消息体签名验证,用于公众平台和公众账号验证消息体的正确性 2.针对推送给微信公众账号的普通消息和事件消息,以及推送给设备公众账号的设备消息进行加密 3.公众 ...

  3. Spring Cloud Config 配置中心 自动加解密功能 jasypt方式

    使用此种方式会存在一种问题:如果我配置了自动配置刷新,则刷新过后,加密过后的密文无法被解密.具体原因分析,看 SpringCloud 详解配置刷新的原理 使用  jasypt-spring-boot- ...

  4. SpringBoot中如何灵活的实现接口数据的加解密功能?

    数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...

  5. Spring Cloud Config 配置中心 自动加解密功能 JCE方式

    1.首先安装JCE JDK8的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.h ...

  6. java实现根据特定密钥对字符串进行加解密功能

    在项目中我们经常遇到这样的场景,我们避免重要资源泄露需要将一些信息按照特定的方式(密钥)进行加密保存,然后在使用的时候再按照特定的方式(密钥)进行解密读取,以保证信息的相对安全.那么如何对信息进行加解 ...

  7. PHP自动加载功能原理解析

    前言 这篇文章是对PHP自动加载功能的一个总结,内容涉及PHP的自动加载功能.PHP的命名空间.PHP的PSR0与PSR4标准等内容. 一.PHP自动加载功能 PHP自动加载功能的由来 在PHP开发过 ...

  8. 通过T-SQL语句实现数据库加解密功能

    CREATE TABLE [dbo].[Users] ( [U_nbr] NVARCHAR(20) NOT NULL PRIMARY KEY, [Pwd] nvarchar(MAX) ) --加密 D ...

  9. ASE加解密算法详细介绍

    AEC扫盲主要增对CBC模式做详细讲解: https://blog.csdn.net/qq_28205153/article/details/55798628 AEC其他几种模式详细介绍 https: ...

随机推荐

  1. 采用SharePoint Designer将JavaScript而他们的网站页面集成的定义

    采用SharePoint Designer将JavaScript而他们的网站页面集成的定义 像JavaScript这种动态脚本语言可以给你的页面震撼效果.为了加盟JavaScript要定义自己的网站页 ...

  2. 【原创】leetCodeOj --- Interleaving String 解题报告

    题目地址: https://oj.leetcode.com/problems/interleaving-string/ 题目内容: Given s1, s2, s3, find whether s3  ...

  3. A. Initial Bet(Codeforces Round #273)

    A. Initial Bet time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  4. QoS令牌桶工作原理

    QoS的一个重要作用就是对port流量进行监管,也就是限制port流量.但QoS是怎样做到这点的呢?那就是QoS的令牌桶机制了.以下是在笔者刚刚出版的<Cisco/H3C交换机高级配置与管理技术 ...

  5. servlet(jsp)中的重定向和转发

    servlet(jsp)中的重定向和转发 由一个servlet(jsp)从内部转向还有一个servlet(jsp)有两种方式:转发和重定向. 转发:是由一个web组件(servlet)将未完毕的处理交 ...

  6. HDU 4391 Paint The Wall 段树(水

    意甲冠军: 特定n多头排列.m操作 以下是各点的颜色 以下m一种操纵: 1 l r col 染色 2 l r col 问间隔col色点 == 通的操作+区间内最大最小颜色数的优化,感觉非常不科学... ...

  7. IP多播(组播)

    IP多播是实现数据一对多通信的模式.从一个源点传送到多个目的地,数据仅仅拷贝一份.这里说的数据仅仅拷贝一份,是指在每一条须要它的两个点之间,数据仅仅有一份.例如以下图为<计算机网络>(谢希 ...

  8. system strategies of Resources Deadlock

    In computer science, Deadlock is a naughty boy aroused by compete for resources. Even now,     there ...

  9. Android开发技巧——PagerAdapter再简单的包

    再次内容View的ViewPager该适配器PagerAdapter简包,支持List数据与SparseArray数据.随着更新的浏览功能. 首先,首先贴上顶部抽象类代码: /* * Date: 14 ...

  10. Linux删除以破折号开头的文件Windows在批处理文件来删除隐藏属性

    昨天去打印店打印的材料.结果中毒.所有的文件被隐藏.生成一个一堆快捷键.回来后.我很容易地把它放入Linux机,我想删除这些文件怪. 下面是该过程,遇到的问题. 1.您无法删除'-'该文件的开头 最初 ...