1. 程式人生 > >微信退款申請成功非同步通知使用AES解密問題

微信退款申請成功非同步通知使用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。

因為版本對應不上搞了兩天終於搞定...特此記錄