消息體簽名與加解密-開發者Q&A
Q 為什么要上線消息加密功能?
A 為了更好的保護用戶和公眾賬號的信息安全。
Q 接入消息加解密功能復雜嗎?
A 開發者接入消息加解密功能并不復雜,微信團隊提供了5種語言的示例代碼(包括C++、php、Python、Java和C#),對于使用這個5種語言的開發者,只需根據《消息加解密接入指引》,參考示例代碼,調用微信公眾平臺提供的函數即可;而對于其他語言的開發者,需根據《消息加解密詳細技術方案》編寫相關代碼。
Q 消息加密功能將帶來哪些重要變化?
A 有如下幾個方面:
選擇明文模式時,收發消息的方式和原先相同,但安全系數較低,微信團隊推薦開發者在兼容模式下開發調試,并升級到安全模式;
選擇兼容模式時,消息包同時包括明文和密文,消息包的長度會相應增加到原來的3倍左右,開發者需檢查系統,做好預留,防止因消息變長而接收出錯;
兼容模式和安全模式下,公眾平臺服務器向公眾賬號服務器配置地址URL推送消息時,將會增加兩個參數;
安全模式下,內容為純密文,請提前做好接收消息的解密工作和回復消息的加密工作。
Q 什么是EncodingAESKey?
A 微信公眾平臺采用AES對稱加密算法對推送給公眾帳號的消息體對行加密,EncodingAESKey則是加密所用的秘鑰。公眾帳號用此秘鑰對收到的密文消息體進行解密,回復消息體也用此秘鑰加密。
Q 開發者如何判斷消息是否被加密?什么情況下需要對回包進行加密?
A 請開發者根據URL參數來判斷:url上無encrypt_type參數或者其值為raw,表示消息體僅含有明文,公眾賬號回復明文。encrypt_type為aes則表示消息體含有密文,公眾賬號回復密文(兼容模式期間回復明文或密文均可)。
Q 公眾賬號開發者上線加解密版本后,還需要保留明文解包和回包邏輯嗎?
A 暫時先保留之前的邏輯,根據參數判斷,也做成兼容模式比較好。
Q 常見錯誤舉例
A 常見錯誤原因如:
xml格式不對:如<TimeStamp>寫成了<Timestamp > (s小寫了且p和>中間有空格)
公眾平臺網站提供了修改EncodingAESKey的功能,公眾賬號需要保存當前的和上一次的EncodingAESKey,若當前的EncodingAESKey解密失敗,則嘗試用上一次的EncodingAESKey解密。回包時,用哪個Key解密成功,則用此Key加密對應的回包
調用DecryptMsg解密時,傳入的是url上的msg_signature,而不是signature
Java要求jdk 1.6及1.6以上
異常java.security.InvalidKeyException:illegal Key Size的解決方案:在官方網站下載JCE無限制權限策略文件(請到官網下載對應的版本, 例如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 微信公眾平臺接口調試工具是否支持消息體加解密的在線調試?
A 點擊http://mp.weixin.qq.com/debug