[TOC]
概述
企业微信在推送消息给企业时,会对消息内容做AES加密,以XML格式POST到企业应用的URL上。
企业在被动响应时,也需要对数据加密,以XML格式返回给企业微信。
本章节即是对加解密方法的说明。
阅读本章节前,需要了解以下术语:
msg_signature: 消息签名,用于验证请求是否来自企业微信(防止攻击者伪造)。
EncodingAESKey:用于消息体的加密,长度固定为43个字符,从a-z, A-Z, 0-9共62个字符中选取,是AESKey的Base64编码。解码后即为32字节长的AESKey
AESKey=Base64_Decode(EncodingAESKey + “=”)
AESKey:AES算法的密钥,长度为32字节。
AES采用CBC模式,数据采用PKCS#7填充至32字节的倍数;IV初始向量大小为16字节,取AESKey前16字节,详见:http://tools.ietf.org/html/rfc2315
msg:为消息体明文,格式为XML
msg_encrypt:明文消息msg加密处理后的Base64编码。
使用已有库
鉴于加解密算法相对复杂,企业微信提供了算法库。
目前已有c++/python/php/java/golang/c#等语言版本。均提供了解密、加密、验证URL三个接口,企业可根据自身需要下载,下载地址。
使用现有库,用户不必细究加解密原理。对于找不到相应语言库的用户,请阅读后文原理详解自行实现。欢迎大家分享~
以c++为例,使用示例见下载的文件夹中的Sample.cpp, 此处做简单说明。
初始化加解密类WXBizMsgCrypt wxcpt(sToken,sEncodingAESKey,sReceiveId);
要求传参数sToken,sEncodingAESKey,sReceiveId。
sToken,sEncodingAESKey即设置接收消息的参数章节所述配置的Token、EncodingAESKey。
特别注意, sReceiveId 在不同场景下有不同含义,见附注。
验证URL函数
本函数实现:
签名校验
解密数据包,得到明文消息内容
int VerifyURL(const string &sMsgSignature, const string &sTimeStamp, const string &sNonce, const string &sEchoStr, string &sReplyEchoStr);参数说明
参数
必须
说明
sMsgSignature
是
从