消息體簽名與加解密-開發(fā)者Q&A
Q 為什么要上線消息加密功能?
A 為了更好的保護(hù)用戶和公眾賬號的信息安全。
Q 接入消息加解密功能復(fù)雜嗎?
A 開發(fā)者接入消息加解密功能并不復(fù)雜,微信團(tuán)隊提供了5種語言的示例代碼(包括C++、php、Python、Java和C#),對于使用這個5種語言的開發(fā)者,只需根據(jù)《消息加解密接入指引》,參考示例代碼,調(diào)用微信公眾平臺提供的函數(shù)即可;而對于其他語言的開發(fā)者,需根據(jù)《消息加解密詳細(xì)技術(shù)方案》編寫相關(guān)代碼。
Q 消息加密功能將帶來哪些重要變化?
A 有如下幾個方面:
選擇明文模式時,收發(fā)消息的方式和原先相同,但安全系數(shù)較低,微信團(tuán)隊推薦開發(fā)者在兼容模式下開發(fā)調(diào)試,并升級到安全模式;
選擇兼容模式時,消息包同時包括明文和密文,消息包的長度會相應(yīng)增加到原來的3倍左右,開發(fā)者需檢查系統(tǒng),做好預(yù)留,防止因消息變長而接收出錯;
兼容模式和安全模式下,公眾平臺服務(wù)器向公眾賬號服務(wù)器配置地址URL推送消息時,將會增加兩個參數(shù);
安全模式下,內(nèi)容為純密文,請?zhí)崆白龊媒邮障⒌慕饷芄ぷ骱突貜?fù)消息的加密工作。
Q 什么是EncodingAESKey?
A 微信公眾平臺采用AES對稱加密算法對推送給公眾帳號的消息體對行加密,EncodingAESKey則是加密所用的秘鑰。公眾帳號用此秘鑰對收到的密文消息體進(jìn)行解密,回復(fù)消息體也用此秘鑰加密。
Q 開發(fā)者如何判斷消息是否被加密?什么情況下需要對回包進(jìn)行加密?
A 請開發(fā)者根據(jù)URL參數(shù)來判斷:url上無encrypt_type參數(shù)或者其值為raw,表示消息體僅含有明文,公眾賬號回復(fù)明文。encrypt_type為aes則表示消息體含有密文,公眾賬號回復(fù)密文(兼容模式期間回復(fù)明文或密文均可)。
Q 公眾賬號開發(fā)者上線加解密版本后,還需要保留明文解包和回包邏輯嗎?
A 暫時先保留之前的邏輯,根據(jù)參數(shù)判斷,也做成兼容模式比較好。
Q 常見錯誤舉例
A 常見錯誤原因如:
xml格式不對:如<TimeStamp>寫成了<Timestamp > (s小寫了且p和>中間有空格)
公眾平臺網(wǎng)站提供了修改EncodingAESKey的功能,公眾賬號需要保存當(dāng)前的和上一次的EncodingAESKey,若當(dāng)前的EncodingAESKey解密失敗,則嘗試用上一次的EncodingAESKey解密。回包時,用哪個Key解密成功,則用此Key加密對應(yīng)的回包
調(diào)用DecryptMsg解密時,傳入的是url上的msg_signature,而不是signature
Java要求jdk 1.6及1.6以上
異常java.security.InvalidKeyException:illegal Key Size的解決方案:在官方網(wǎng)站下載JCE無限制權(quán)限策略文件(請到官網(wǎng)下載對應(yīng)的版本, 例如JDK7的下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html 下載后解壓,可以看到local_policy.jar和US_export_policy.jar以及readme.txt,如果安裝了JRE,將兩個jar文件放到%JRE_HOME%\lib\security目錄下覆蓋原來的文件;如果安裝了JDK,將兩個jar文件放到%JDK_HOME%\jre\lib\security目錄下覆蓋原來文件
Q 微信公眾平臺接口調(diào)試工具是否支持消息體加解密的在線調(diào)試?
A 點(diǎn)擊http://mp.weixin.qq.com/debug