3

如果我想使用 java 和密钥长度超过 128 位的加密,我必须使用 Java 策略文件。如何使用 openjre 启动和运行这些应用程序?我得到与使用没有策略文件的 oracle jre 相同的错误,但我不能简单地使用 Oracle 策略文件?或者我可以吗?

或者会用 openjdk 帮助构建项目吗?

谢谢你

4

2 回答 2

3

我发现了以下内容。它似乎解决了我曾经遇到的所有政策问题。

  try {
    Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
    field.setAccessible(true);
    field.set(null, java.lang.Boolean.FALSE);
  } catch (Exception ex) {

  }

这不是很好,但工作!

于 2013-01-29T10:25:35.173 回答
3

另一个答案是正确的,但不完整。经过一番折腾,我找到了下面对我有用的代码。不用担心法律方面的问题,自 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);
于 2014-01-15T21:20:34.220 回答