Использование шифрования, которое потребовало бы файлов политики Java в openjre

Если я хочу использовать Java и шифрование с ключами длиннее 128 бит, я должен использовать Java Policy Files. Как запустить эти приложения в openjre? Я получаю ту же ошибку, что и при использовании oracle jre без файлов политики, но я не могу просто использовать Oracle Policy Files? или я могу?

Или поможет построить проект с openjdk?

Благодарю вас

2 ответа

Решение

Я нашел следующее. Кажется, это решает все проблемы политики, которые у меня когда-либо были.

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

  }

Это не приятно, но работает!

Другой ответ в правильных строках, но неполный. После долгих попыток я натолкнулся на следующий код, который мне подходит. Не беспокойтесь о юридических аспектах, Oracle на самом деле имеет разрешение избавиться от этой глупой глупости по контролю за экспортом с 2011 года, но просто еще не дошла до обновления 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);
Другие вопросы по тегам