国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 02:36:06
字體:
來源:轉載
供稿:網友

微信消息體簽名及加解密功能詳細解析以及.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算法的加解密密鑰。然后保存即可。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泸水县| 长宁区| 凤冈县| 两当县| 长治县| 淮滨县| 邢台市| 新兴县| 广河县| 阳山县| 三门峡市| 新密市| 手游| 扶绥县| 龙岩市| 轮台县| 临武县| 隆化县| 宁陕县| 辽宁省| 长白| 绥化市| 常德市| 长海县| 凌海市| 晋城| 河东区| 泾源县| 辽源市| 若羌县| 清徐县| 六安市| 金山区| 大关县| 宜兴市| 工布江达县| 三原县| 丰镇市| 宝坻区| 尼玛县| 得荣县|