因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制。比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件。
对于Java 8 Update 144和更早版本,需要安装Java密码学扩展(JCE)无限强度管辖权策略文件:
- 从此处下载无限强度的JCE策略文件
- 解压缩下载的文件
- 用
$JAVA_HOME/jre/lib/security
提取的无限强度策略JAR文件替换现有的策略JAR文件
注意:如果您以后决定恢复到原始的受限策略版本,请首先在中备份原始JCE策略文件(US_export_policy.jar和local_policy.jar)
$JAVA_HOME/jre/lib/security
。
Java 8 Update 151及更高版本
包括了“无限强度管辖策略”,但默认情况下不使用。要启用它,您需要java.security
在$JAVA_HOME/jre/lib/security
(对于JDK)或$JAVA_HOME/lib/security
(对于JRE)中编辑文件。取消注释(或包括)该行:
crypto.policy=unlimited
官方网站提供了JCE无限制权限策略文件的下载:
JDK6的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
JDK7的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK8的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
使用反射修改JDK关键代码
//这里是通过反射移除了isRestricted 的变量修饰符:final //然后将isRestricted 赋值为false即可 static { //break JCE crypto policy limit try { Class<?> clazz = Class.forName("javax.crypto.JceSecurity"); Field nameField = clazz.getDeclaredField("isRestricted");
Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(nameField, nameField.getModifiers() & ~Modifier.FINAL); nameField.setAccessible(true); nameField.set(null, java.lang.Boolean.FALSE); } catch (Exception ex) { ex.printStackTrace(); } }