У меня есть приложение, которое использует 256-битное шифрование AES, которое не поддерживается Java из коробки. Я знаю, чтобы заставить это работать правильно, я устанавливаю банки неограниченной силы JCE в папку безопасности. Это нормально для меня как разработчика, я могу их установить.
Мой вопрос заключается в том, что поскольку это приложение будет распространяться, конечным пользователям, скорее всего, не будут установлены эти файлы политики. Конечный пользователь загружает их только для того, чтобы функция приложения не была привлекательной.
Есть ли способ заставить мое приложение работать без перезаписи файлов на компьютере конечного пользователя? Стороннее программное обеспечение, которое может обрабатывать его без установленных файлов политики? Или способ просто ссылаться на эти файлы политики изнутри JAR?
источник
Ответы:
Есть несколько часто цитируемых решений этой проблемы. К сожалению, ни один из них не является полностью удовлетворительным:
Но тогда есть отражение. Есть ли что-то, что вы не можете сделать с помощью отражения?
Просто позвоните
removeCryptographyRestrictions()
из статического инициализатора или тому подобное, прежде чем выполнять какие-либо криптографические операции.JceSecurity.isRestricted = false
Часть все , что необходимо для использования 256-битных шифров непосредственно; однако, без двух других операций,Cipher.getMaxAllowedKeyLength()
все равно будет продолжать сообщать 128, и 256-битные наборы шифров TLS не будут работать.Этот код работает на Oracle Java 7 и 8 и автоматически пропускает процесс на Java 9 и OpenJDK там, где он не нужен. В конце концов, будучи уродливым хакером, он, вероятно, не работает на виртуальных машинах других производителей.
Это также не работает в Oracle Java 6, потому что частные классы JCE там запутаны. Однако запутывание не меняется от версии к версии, поэтому технически возможно поддерживать Java 6.
источник
final
полем в 8u111 я изменил его, чтобы он мог изменить последнее поле, следуя этому ответу . Результат примерно такой же, как и в новой версии ntoskrnl, за исключением того, что я не объявилmodifiersField
какfinal
. Один из моих пользователей сообщает, что он работает и в 8u112.Теперь это больше не нужно ни для Java 9 , ни для какого-либо недавнего выпуска Java 6, 7 или 8. Наконец! :)
Согласно JDK-8170157 , неограниченная криптографическая политика теперь включена по умолчанию.
Конкретные версии из выпуска JIRA:
Обратите внимание, что если по какой-то странной причине в Java 9 требуется старое поведение, его можно установить с помощью:
источник
Вот решение: http://middlesphere-1.blogspot.ru/2014/06/this-code-allows-to-break-limit-if.html
источник
java.security.InvalidKeyException: Wrong algorithm: AES or Rijndael required
isRestricted
поле станет окончательным ( bugs.openjdk.java.net/browse/JDK-8149417 ). Ответ @ ntoskrnl заботится о любом возможном включении модификатора «final». Комментарий @ M.Dudley к Лицензионному соглашению Java также остается в силе.Насколько я могу судить, Bouncy Castle по-прежнему требует установки банок.
Я сделал небольшой тест, и это, кажется, подтверждает это:
http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions
источник
Начиная с JDK 8u102 опубликованные решения, основанные на рефлексии, больше не будут работать: поле, в котором теперь установлены эти решения
final
( https://bugs.openjdk.java.net/browse/JDK-8149417 ).Похоже, что он вернулся либо к (а) использованию Bouncy Castle, либо (б) к установке файлов политики JCE.
источник
isRestricted
области, поскольку оно заботится о возможном добавлении модификатора «final».Для альтернативной библиотеки криптографии, посмотрите на Bouncy Castle . Он имеет AES и много дополнительных функций. Это либеральная библиотека с открытым исходным кодом. Вы должны будете использовать легкий, проприетарный API Bouncy Castle, чтобы это работало.
источник
Вы могли бы использовать метод
чтобы проверить доступную длину ключа, используйте это и сообщите пользователю о том, что происходит. Например, из-за того, что файлы политики не устанавливаются, ваше приложение использует 128-битные ключи. Заботящиеся о безопасности пользователи установят файлы политики, другие продолжат использовать более слабые ключи.
источник
Для нашего приложения у нас была архитектура клиент-сервер, и мы разрешали только дешифрование / шифрование данных на уровне сервера. Следовательно файлы JCE нужны только там.
У нас была еще одна проблема, когда нам нужно было обновить JAR-файл безопасности на клиентских компьютерах: через JNLP он перезаписывает библиотеки
${java.home}/lib/security/
и JVM при первом запуске.Это заставило это работать.
источник
Вот обновленная версия ответа ntoskrnl . Он также содержит функцию для удаления окончательного модификатора, подобного Арджану, упомянутому в комментариях.
Эта версия работает с JRE 8u111 или новее.
источник
((Map<?, ?>) perms.get(defaultPolicy)).clear();
выдает ошибку компилятора. Комментирование не влияет на его функциональность. Нужна ли эта линия?Вот модифицированная версия @ Ntoskrnl код с изображением
isRestrictedCryptography
проверки по фактическимCipher.getMaxAllowedKeyLength
, регистрациям SLF4J и поддержке одноплодной инициализации из приложения начальной загрузки , как это:Этот код будет корректно останавливать искажение с отражением, когда неограниченная политика станет доступной по умолчанию в Java 8u162, как предсказывает ответ @ cranphin.
источник
Во время установки вашей программы просто предложите пользователю загрузить пакетный сценарий DOS или сценарий оболочки Bash и скопируйте JCE в нужное место в системе.
Раньше я делал это для веб-службы сервера, и вместо формального установщика я просто предоставлял сценарии для настройки приложения до того, как пользователь сможет его запустить. Вы можете отключить запуск приложения, пока он не запустит скрипт установки. Вы могли бы также заставить приложение жаловаться на отсутствие JCE, а затем попросить загрузить и перезапустить приложение?
источник