程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 微信消息體簽名及加解密功能詳細解析以及.net實現,解密.net

微信消息體簽名及加解密功能詳細解析以及.net實現,解密.net

編輯:C#入門知識

微信消息體簽名及加解密功能詳細解析以及.net實現,解密.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算法的加解密密鑰。然後保存即可。    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved