自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

何使用示例代碼接入加解密及技術(shù)方案

移動(dòng)開發(fā) Android
如何使用示例代碼接入加解密,參考本文檔并使用示例代碼,加解密的接入將非常簡(jiǎn)單。若想進(jìn)一步的了解細(xì)節(jié),請(qǐng)查看技術(shù)方案。 微信公眾平臺(tái)提供了C++、php、Java、Python和C# 5種語(yǔ)言的示例代碼,每種語(yǔ)言的類名和接口名均一致,下面以C++為例說明:

如何使用示例代碼接入加解密,參考本文檔并使用示例代碼,加解密的接入將非常簡(jiǎn)單。若想進(jìn)一步的了解細(xì)節(jié),請(qǐng)查看技術(shù)方案。 微信公眾平臺(tái)提供了C++、php、Java、Python和C# 5種語(yǔ)言的示例代碼,每種語(yǔ)言的類名和接口名均一致,下面以C++為例說明:

函數(shù)說明

構(gòu)造函數(shù)

  1. // @param sToken: 公眾平臺(tái)上,開發(fā)者設(shè)置的Token 
  2. // @param sEncodingAESKey: 公眾平臺(tái)上,開發(fā)者設(shè)置的EncodingAESKey 
  3. // @param sAppid: 公眾號(hào)的appid 
  4. WXBizMsgCrypt(const std::string &sToken, 
  5. const std::string &sEncodingAESKey, 
  6. const std::string &sAppid); 

解密函數(shù)

  1. // 檢驗(yàn)消息的真實(shí)性,并且獲取解密后的明文 
  2. // @param sMsgSignature: 簽名串,對(duì)應(yīng)URL參數(shù)的msg_signature 
  3. // @param sTimeStamp: 時(shí)間戳,對(duì)應(yīng)URL參數(shù)的timestamp 
  4. // @param sNonce: 隨機(jī)串,對(duì)應(yīng)URL參數(shù)的nonce 
  5. // @param sPostData: 密文,對(duì)應(yīng)POST請(qǐng)求的數(shù)據(jù) 
  6. // @param sMsg: 解密后的明文,當(dāng)return返回0時(shí)有效 
  7. // @return: 成功0,失敗返回對(duì)應(yīng)的錯(cuò)誤碼 
  8. int DecryptMsg(const std::string &sMsgSignature, 
  9. const std::string &sTimeStamp, 
  10. const std::string &sNonce, 
  11. const std::string &sPostData, 
  12. std::string &sMsg); 

加密函數(shù)

  1. //將公眾號(hào)回復(fù)用戶的消息加密打包 
  2. // @param sReplyMsg:公眾號(hào)待回復(fù)用戶的消息,xml格式的字符串 
  3. // @param sTimeStamp: 時(shí)間戳,可以自己生成,也可以用URL參數(shù)的timestamp 
  4. // @param sNonce: 隨機(jī)串,可以自己生成,也可以用URL參數(shù)的nonce 
  5. // @param sEncryptMsg: 加密后的可以直接回復(fù)用戶的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串,當(dāng)return返回0時(shí)有效 
  6. // return:成功0,失敗返回對(duì)應(yīng)的錯(cuò)誤碼 
  7. int EncryptMsg(const std::string &sReplyMsg, 
  8. const std::string &sTimeStamp, 
  9. const std::string &sNonce, 
  10. std::string &sEncryptMsg); 

使用方法

在安全模式或兼容模式下,url上會(huì)新增兩個(gè)參數(shù)encrypt_type和msg_signature。encrypt_type表示加密類型,msg_signature:表示對(duì)消息體的簽名。 url上無(wú)encrypt_type參數(shù)或者其值為raw時(shí)表示為不加密;encrypt_type為aes時(shí),表示aes加密(暫時(shí)只有raw和aes兩種值)。公眾帳號(hào)開發(fā)者根據(jù)此參數(shù)來(lái)判斷微信公眾平臺(tái)發(fā)送的消息是否加密。

兼容模式和安全模式加解密的方法完全一樣,兼容模式的xml消息體比安全模式多了幾個(gè)明文字段,具體請(qǐng)查看《消息加解密詳細(xì)技術(shù)方案》。

實(shí)例化對(duì)象

使用構(gòu)造函數(shù),實(shí)例化一個(gè)對(duì)象,傳入公眾帳號(hào)的token, appid, EncodingAESKey。

解密

安全模式或者兼容模式下,公眾號(hào)收到以下帶密文消息體(“……”表示兼容模式下的明文字段):

  1. encrypt_msg = 
  2. <xml> 
  3. <ToUserName><![CDATA[gh_10f6c3c3ac5a]]></ToUserName> 
  4. …… 
  5. <Encrypt><![CDATA[hQM/NS0ujPGbF+/8yVe61E3mUVWVO1izRlZdyv26zrVUSE3zUEBdcXITxjbjiHH38kexVdpQLCnRfbrqny1yGvgqqKTGKxJWWQ9D5WiiUKxavHRNzYVzAjYkp7esNGy7HJcl/P3BGarQF3+AWyNQ5w7xax5GbOwiXD54yri7xmNMHBOHapDzBslbnTFiEy+8sjSl4asNbn2+ZVBpqGsyKDv0ZG+DlSlXlW+gNPVLP+YxeUhJcyfp91qoa0FJagRNlkNul4mGz+sZXJs0WF7lPx6lslDGW3J66crvIIx/klpl0oa/tC6n/9c8OFQ9pp8hrLq7B9EaAGFlIyz5UhVLiWPN97JkL6JCfxVooVMEKcKRrrlRDGe8RWVM3EW/nxk9Ic37lYY5j97YZfq375AoTBdGDtoPFZsvv3Upyut1i6G0JRogUsMPlyZl9B8Pl/wcA7k7i4LYMr2yK4SxNFrBUw==]]></Encrypt> 
  6. </xml> 

調(diào)用DecryptMsg接口,傳入收到的url上的參數(shù):msg_signature(注意:不是signature,而是msg_signature), timestamp, nonce和接收到的encrypt_msg,若調(diào)用成功,sMsg則為輸出結(jié)果,其內(nèi)容為如下的明文的xml消息體:

  1. <xml> 
  2. <ToUserName><![CDATA[gh_10f6c3c3ac5a]]></ToUserName> 
  3. <FromUserName><![CDATA[oyORnuP8q7ou2gfYjqLzSIWZf0rs]]></FromUserName> 
  4. <CreateTime>1411035097</CreateTime> 
  5. <MsgType><![CDATA[text]]></MsgType> 
  6. <Content><![CDATA[this is a test message]]></Content> 
  7. <MsgId>6060349595123187712</MsgId> 
  8. </xml> 

#p#

公眾帳號(hào)處理消息

生成需要回復(fù)給微信公眾平臺(tái)的xml消息體,假設(shè)回復(fù)以下內(nèi)容:

  1. res_msg = 
  2. <xml> 
  3. <ToUserName><![CDATA[oyORnuP8q7ou2gfYjqLzSIWZf0rs]]></ToUserName> 
  4. <FromUserName><![CDATA[gh_10f6c3c3ac5a]]></FromUserName> 
  5. <CreateTime>1411034505</CreateTime> 
  6. <MsgType><![CDATA[text]]></MsgType> 
  7. <Content><![CDATA[Welcome to join us!]]></Content> 
  8. <FuncFlag>0</FuncFlag> 
  9. </xml> 

回包加密

調(diào)用EncryptMsg接口,傳入需要回復(fù)給微信公眾平臺(tái)的res_msg, timestamp, nonce,若加密成功,則sEncryptMsg為密文消息體,內(nèi)容如下:

  1. <xml> 
  2. <Encrypt><![CDATA[LDFAmKFr7U/RMmwRbsR676wjym90byw7+hhh226e8bu6KVYy00HheIsVER4eMgz/VBtofSaeXXQBz6fVdkN2CzBUaTtjJeTCXEIDfTBNxpw/QRLGLqqMZHA3I+JiBxrrSzd2yXuXst7TdkVgY4lZEHQcWk85x1niT79XLaWQog+OnBV31eZbXGPPv8dZciKqGo0meTYi+fkMEJdyS8OE7NjO79vpIyIw7hMBtEXPBK/tJGN5m5SoAS6I4rRZ8Zl8umKxXqgr7N8ZOs6DB9tokpvSl9wT9T3E62rufaKP5EL1imJUd1pngxy09EP24O8Th4bCrdUcZpJio2l11vE6bWK2s5WrLuO0cKY2GP2unQ4fDxh0L4ePmNOVFJwp9Hyvd0BAsleXA4jWeOMw5nH3Vn49/Q/ZAQ2HN3dB0bMA+6KJYLvIzTz/Iz6vEjk8ZkK+AbhW5eldnyRDXP/OWfZH2P3WQZUwc/G/LGmS3ekqMwQThhS2Eg5t4yHv0mAIei07Lknip8nnwgEeF4R9hOGutE9ETsGG4CP1LHTQ4fgYchOMfB3wANOjIt9xendbhHbu51Z4OKnA0F+MlgZomiqweT1v/+LUxcsFAZ1J+Vtt0FQXElDKg+YyQnRCiLl3I+GJ/cxSj86XwClZC3NNhAkVU11SvxcXEYh9smckV/qRP2Acsvdls0UqZVWnPtzgx8hc8QBZaeH+JeiaPQD88frNvA==]]></Encrypt> 
  3. <MsgSignature><![CDATA[8d9521e63f84b2cd2e0daa124eb7eb0c34b6204a]]></MsgSignature> 
  4. <TimeStamp>1411034505</TimeStamp> 
  5. <Nonce><![CDATA[1351554359]]></Nonce> 
  6. </xml> 

注意事項(xiàng)

EncodingAESKey長(zhǎng)度固定為43個(gè)字符,從a-z,A-Z,0-9共62個(gè)字符中選取。 公眾帳號(hào)可以在公眾平臺(tái)的開發(fā)者中心的服務(wù)器配置修改

出于安全考慮,公眾平臺(tái)網(wǎng)站提供了修改EncodingAESKey的功能(在EncodingAESKey可能泄漏時(shí)進(jìn)行修改),所以建議公眾賬號(hào)保存當(dāng)前的和上一次的EncodinAESKey,若當(dāng)前EncodingAESKey解密失敗,則嘗試用上一次的EncodingAESKey的解密?;匕鼤r(shí),用哪個(gè)Key解密成功,則用此Key加密對(duì)應(yīng)的回包

兼容模式消息體同時(shí)存在明文和密文,消息體會(huì)增至以前的3倍左右,開發(fā)者注意檢查系統(tǒng),防止因消息變長(zhǎng)和URL參數(shù)增加而出現(xiàn)接收錯(cuò)誤

如果url上無(wú)encrypt_type參數(shù)或者其值為raw,則回復(fù)明文,否則回復(fù)密文。兼容模式期間公眾賬號(hào)回復(fù)明文或密文均可(不要兩種類型都回)

函數(shù)錯(cuò)誤返回碼

#p#

示例代碼下載

微信公眾平臺(tái)為開發(fā)者提供了5種語(yǔ)言的示例代碼(包括C++、php、Java、Python和C#版本) 點(diǎn)擊下載 ../static/assets/a5a22f38cb60228cb32ab61d9e4c414b.zip

微信公眾平臺(tái)接口調(diào)試工具

點(diǎn)擊進(jìn)入 http://mp.weixin.qq.com/debug

技術(shù)方案

1. EncodingAESKey長(zhǎng)度固定為43個(gè)字符,從a-z,A-Z,0-9共62個(gè)字符中選取,公眾帳號(hào)可以在公眾平臺(tái)的開發(fā)者中心的服務(wù)器配置修改;

2. AES密鑰:AESKey=Base64_Decode(EncodingAESKey + “=”),EncodingAESKey尾部填充一個(gè)字符的“=”, 用Base64_Decode生成32個(gè)字節(jié)的AESKey;

3. AES采用CBC模式,秘鑰長(zhǎng)度為32個(gè)字節(jié),數(shù)據(jù)采用PKCS#7填充;PKCS#7:K為秘鑰字節(jié)數(shù)(采用32),buf為待加密的內(nèi)容,N為其字節(jié)數(shù)。Buf需要被填充為K的整數(shù)倍。在buf的尾部填充(K-N%K)個(gè)字節(jié),每個(gè)字節(jié)的內(nèi)容是(K- N%K);

具體詳見:http://tools.ietf.org/html/rfc2315

5. 出于安全考慮,公眾平臺(tái)網(wǎng)站提供了修改EncodingAESKey的功能(在EncodingAESKey可能泄漏時(shí)進(jìn)行修改),所以建議公眾賬號(hào)保存當(dāng)前的和上一次的EncodingAESKey,若當(dāng)前EncodingAESKey生成的AESKey解密失敗,則嘗試用上一次的AESKey的解密?;匕鼤r(shí),用哪個(gè)AESKey解密成功,則用此AESKey加密對(duì)應(yīng)的回包;

6. 兼容模式消息體同時(shí)存在明文和密文,消息體會(huì)增至以前的3倍左右,開發(fā)者注意檢查系統(tǒng),防止因消息變長(zhǎng)和URL參數(shù)增加而出現(xiàn)接收錯(cuò)誤;

7. 微信團(tuán)隊(duì)提供了多種語(yǔ)言的示例代碼(包括php、Java、C++、Python、C#),請(qǐng)開發(fā)者盡量使用示例代碼。(../static/assets/a5a22f38cb60228cb32ab61d9e4c414b.zip )

下面以普通文本消息為例,詳細(xì)說明公眾平臺(tái)對(duì)消息體加解密的方法和流程,其它普通消息和事件消息的加解密可以此類推。

公眾賬號(hào)接收用戶消息

消息體加密

現(xiàn)有消息為明文,格式如下:

  1. msg =  
  2. <xml> 
  3.     <ToUserName><![CDATA[toUser]]></ToUserName> 
  4.     <FromUserName><![CDATA[fromUser]]></FromUserName>  
  5.     <CreateTime>1348831860</CreateTime> 
  6.     <MsgType><![CDATA[text]]></MsgType> 
  7.     <Content><![CDATA[this is a test]]></Content> 
  8.     <MsgId>1234567890123456</MsgId> 
  9. </xml> 

兼容模式期間同時(shí)保留明文和密文,消息格式如下:

  1. new_msg= 
  2. <xml> 
  3.     <ToUserName><![CDATA[toUser]]></ToUserName> 
  4.     <FromUserName><![CDATA[fromUser]]></FromUserName>  
  5.     <CreateTime>1348831860</CreateTime> 
  6.     <MsgType><![CDATA[text]]></MsgType> 
  7.     <Content><![CDATA[this is a test]]></Content> 
  8.     <MsgId>1234567890123456</MsgId> 
  9.     <Encrypt><![CDATA[msg_encrypt]]</Encrypt> 
  10. </xml> 

安全模式下,消息體只有密文,格式如下:

  1. new_msg= 
  2. <xml>  
  3.     <ToUserName><![CDATA[toUser]]</ToUserName> 
  4.        <Encrypt><![CDATA[msg_encrypt]]</Encrypt> 
  5. </xml> 
  6.  
  7. 其中,msg_encrypt = Base64_Encode( AES_Encrypt[ random(16B) + msg_len(4B) + msg + $AppId] )  

AES加密的buf由16個(gè)字節(jié)的隨機(jī)字符串、4個(gè)字節(jié)的msg_len(網(wǎng)絡(luò)字節(jié)序)、msg和$AppId組成,其中msg_len為msg的長(zhǎng)度,$AppId為公眾帳號(hào)的AppId

AESKey =Base64_Decode(EncodingAESKey + “=”),32個(gè)字節(jié)

url上增加參數(shù)encrypt_type,encrypt_type的值為raw時(shí)表示為不加密,encrypt_type的值為aes時(shí),表示aes加密(暫時(shí)只有raw和aes兩種值),無(wú)encrypt_type參數(shù)同樣表示不加密

消息體簽名

為了驗(yàn)證消息體的合法性,公眾平臺(tái)新增消息體簽名,開發(fā)者可用以驗(yàn)證消息體的真實(shí)性,并對(duì)驗(yàn)證通過的消息體進(jìn)行解密

在url上增加參數(shù):msg_signature

msg_signature=sha1(sort(Token、timestamp、nonce, msg_encrypt))

消息體驗(yàn)證和解密

開發(fā)者先驗(yàn)證消息體簽名的正確性,驗(yàn)證通過后,再對(duì)消息體進(jìn)行解密。

驗(yàn)證方式

1. 開發(fā)者計(jì)算簽名,dev_msg_signature=sha1(sort(Token、timestamp、nonce, msg_encrypt))

2. 比較dev_msg_signature和URL上帶的msg_signature是否相等,相等則表示驗(yàn)證通過

解密方式如下:

  1. 1. aes_msg=Base64_Decode(msg_encrypt) 
  2.  
  3. 2. rand_msg=AES_Decrypt(aes_msg) 
  4.  
  5. 3. 驗(yàn)證尾部$AppId是否是自己的AppId,相同則表示消息沒有被篡改,這里進(jìn)一步加強(qiáng)了消息簽名驗(yàn)證 
  6.  
  7. 4. 去掉rand_msg頭部的16個(gè)隨機(jī)字節(jié),4個(gè)字節(jié)的msg_len,和尾部的$AppId即為最終的xml消息體 

公眾賬號(hào)向用戶回復(fù)消息

如果url上無(wú)encrypt_type或者其值為raw,則回復(fù)明文,否則按照上述的加密算法加密回復(fù)密文。兼容模式期間公眾賬號(hào)回復(fù)明文或密文均可(不要兩種類型都回)

回復(fù)消息體的簽名與加密

現(xiàn)有消息格式:

  1. msg
  2. <xml> 
  3. <ToUserName><![CDATA[toUser]]></ToUserName> 
  4. <FromUserName><![CDATA[fromUser]]></FromUserName> 
  5. <CreateTime>12345678</CreateTime> 
  6. <MsgType><![CDATA[text]]></MsgType> 
  7. <Content><![CDATA[你好]]></Content> 
  8. </xml> 

加密后消息格式:

  1. new_msg
  2. <xml> 
  3. <Encrypt><![CDATA[msg_encrypt]]></Encrypt> 
  4. <MsgSignature><![CDATA[msg_signature]]></MsgSignature> 
  5. <TimeStamp>timestamp</TimeStamp> 
  6. <Nonce><![CDATA[nonce]]></Nonce> 
  7. </xml>  

其中,msg_encrypt=Base64_Encode(AES_Encrypt [random(16B)+ msg_len(4B) + msg + $AppId])

random(16B)為16字節(jié)的隨機(jī)字符串;msg_len為msg長(zhǎng)度,占4個(gè)字節(jié)(網(wǎng)絡(luò)字節(jié)序),$AppId為公眾賬號(hào)的AppId

AESKey =Base64_Decode(EncodingAESKey + “=”),32個(gè)字節(jié)

msg_signature=sha1(sort(Token、timestamp、nonce, msg_encrypt))

timestamp、nonce回填請(qǐng)求中的值或者重新生成均可

責(zé)任編輯:chenqingxiang
相關(guān)推薦

2015-02-11 15:23:13

微信SDK

2015-02-11 15:56:20

微信SDK

2018-05-09 10:48:58

Android加密密碼學(xué)

2017-12-07 10:25:55

LinuxGPG加密解密

2011-04-06 10:08:18

路由器pos

2015-11-02 09:31:32

2009-12-24 11:25:14

EPON技術(shù)

2012-12-03 10:59:30

2009-12-30 15:08:17

無(wú)線接入技術(shù)

2020-12-13 09:40:11

物聯(lián)網(wǎng)物聯(lián)網(wǎng)安全加密方法

2016-09-27 19:30:11

2009-12-24 13:21:08

光纖接入網(wǎng)技術(shù)

2009-12-31 10:42:29

光纖接入技術(shù)

2013-11-15 13:06:52

透明加解密hook技術(shù)數(shù)據(jù)安全

2009-06-30 09:50:00

城域網(wǎng)接入部署

2011-08-01 14:36:06

加密RSA

2009-03-25 16:28:46

個(gè)人信息數(shù)據(jù)泄露防護(hù)DLP

2009-10-27 15:49:43

2021-02-04 12:40:09

云專線云計(jì)算云網(wǎng)融合

2022-01-26 07:25:09

PythonRSA加解密
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)