最近在做微信退款解密的時候,Liunx服務器出現這個錯誤Illegal key size or default parameters 原因是Java幾乎各種常用加密算法都能找到對應的實現。因為美國的出口限制,Sun通過權限文件(local_policy.jar、US_export_policy.jar)做了相應限制。因此存在一些問題:●密鑰長度上不能滿足需求(如:java.security.InvalidKeyException: Illegal key size or default parameters),然后網上說要通過替換JDK/jre/lib/security的
local_policy.jar
,US_export_policy.jar,然后我去官網下但是出現404,后面找了很多資源,才找到這兩個文件的下載地址,在替換之間,最好備份原先的jdk的就有的文件,確保不丟失。
文件下載地址: https://download.oracle.com/otn-pub/java/jce/8/jce_policy-8.zip
可是因為我們是Liunx 容器部署,而且要替換這個兩個文件比較麻煩,后面根據官網查閱資料並解決。
鏈接地址:https://www.oracle.com/technetwork/java/javase/8u151-relnotes-3850493.html
在jdk.1.8u151 版本可以通過 Security.setProperty("crypto.policy", "unlimited"); 取消sun的權限限制
注意:jdk使用jdk.1.8u151
以下是解密的代碼
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
import java.util.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
@Component public class AESUtils { /** * 密鑰算法 */ private static final String ALGORITHM = "AES"; /** * 加解密算法/工作模式/填充方式 */ private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS7Padding"; static { Security.addProvider(new BouncyCastleProvider()); Security.setProperty("crypto.policy", "unlimited"); } /** * 退款報文加密 * * @param paySecret 秘鑰 * @param responseStr 微信返回的支付串 * @return 其中的WXPayUti 是通過微信官網的下載的工具類 https://pay.weixin.qq.com/wiki/doc/api/download/WxPayAPI_JAVA.zip * @throws Exception */ private String decryptionMessage(String paySecret, String responseStr) throws Exception { final Base64.Decoder decoder = Base64.getDecoder(); SecretKeySpec key = new SecretKeySpec(WXPayUtil.MD5(paySecret).toLowerCase().getBytes(), ALGORITHM); Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING, "BC"); cipher.init(Cipher.DECRYPT_MODE, key); String decoderXml = new String(cipher.doFinal(decoder.decode(responseStr)), "UTF-8"); return decoderXml; } }