如果我想使用 java 和密钥长度超过 128 位的加密,我必须使用 Java 策略文件。如何使用 openjre 启动和运行这些应用程序?我得到与使用没有策略文件的 oracle jre 相同的错误,但我不能简单地使用 Oracle 策略文件?或者我可以吗?
或者会用 openjdk 帮助构建项目吗?
谢谢你
如果我想使用 java 和密钥长度超过 128 位的加密,我必须使用 Java 策略文件。如何使用 openjre 启动和运行这些应用程序?我得到与使用没有策略文件的 oracle jre 相同的错误,但我不能简单地使用 Oracle 策略文件?或者我可以吗?
或者会用 openjdk 帮助构建项目吗?
谢谢你
我发现了以下内容。它似乎解决了我曾经遇到的所有政策问题。
try {
Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
field.setAccessible(true);
field.set(null, java.lang.Boolean.FALSE);
} catch (Exception ex) {
}
这不是很好,但工作!
另一个答案是正确的,但不完整。经过一番折腾,我找到了下面对我有用的代码。不用担心法律方面的问题,自 2011 年以来,Oracle 实际上有权摆脱这种愚蠢的出口管制废话,但只是还没有时间更新 JVM!(如果您不相信我,请查看他们的错误跟踪器)。
希望这可以帮助。它适用于 Java 8。这部分代码不太可能发生太大变化,但显然,我们在这里摆弄了内部私有代码,因此它可能随时因任何 Java 更新而中断。买者自负。
Field gate = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
gate.setAccessible(true);
gate.setBoolean(null, false);
Field allPerm = Class.forName("javax.crypto.CryptoAllPermission").getDeclaredField("INSTANCE");
allPerm.setAccessible(true);
Object accessAllAreasCard = allPerm.get(null);
final Constructor<?> constructor = Class.forName("javax.crypto.CryptoPermissions").getDeclaredConstructor();
constructor.setAccessible(true);
Object coll = constructor.newInstance();
Method addPerm = Class.forName("javax.crypto.CryptoPermissions").getDeclaredMethod("add", java.security.Permission.class);
addPerm.setAccessible(true);
addPerm.invoke(coll, accessAllAreasCard);
Field defaultPolicy = Class.forName("javax.crypto.JceSecurity").getDeclaredField("defaultPolicy");
defaultPolicy.setAccessible(true);
defaultPolicy.set(null, coll);