微信退款申請成功非同步通知使用AES解密問題
在微信退款申請成功後非同步通知會返回一段加密串(在req_info欄位裡)
按照微信文件的做法是
1.對返回的加密串req_info做base64解碼,得到另一個加密串
byte[] b = Base64Util.decode(map.get("req_info"));
2.對商戶key做md5,得到32位小寫key* ( key設定路徑:微信商戶平臺(pay.weixin.qq.com)-->賬戶設定-->API安全-->金鑰設定 )
這裡的key是微信商戶生成的key 對生成的key進行MD5加密
SecretKeySpec key = new SecretKeySpec(MD5Util.MD5Encode(wechat_key).toLowerCase().getBytes(), "AES");
3.用key*對加密串B做AES-256-ECB解密(PKCS7Padding)
public static String decryptData(byte[] b) throws Exception {
Cipher cipher = null;
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE,key);
return new String(cipher.doFinal(b),"utf-8");
}
當使用PKCS7Padding 進行解密時報錯: Cannot find any provider supporting AES/ECB/PKCS7Padding
其實PKCS7Padding 跟 PKCS5Padding一樣 將PKCS7Padding 換成PKCS5Padding
當使用PKCS5Padding時報錯:Illegal key size or default parameters.
這個錯時因為 使用AES加密時,當金鑰大於128時,程式碼會丟擲java.security.InvalidKeyException: Illegal key size or default parameters
Illegal key size or default parameters是指金鑰長度是受限制的,java執行時環境讀到的是受限的policy檔案。檔案位於${java_home}/jre/lib/security下 這種限制是因為美國對軟體出口的控制。
解決辦法:去掉這種限制需要下載Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.
注意:下載此檔案必須跟本地jdk版本對應上 比如本地jdk版本1.8 下載此檔案時必須是8的版本
下載如下圖
下載解壓後就是替換${java_home}/jre/lib/security/ 下面的local_policy.jar和US_export_policy.jar。
因為版本對應不上搞了兩天終於搞定...特此記錄