最近在做微信退款解密的时候,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; } }