Защита файлов jar Java для распространения
Я работаю над приложением, которое я скоро буду распространять. Я хотел бы сделать все, что в моих силах, чтобы убедиться, что те, кто загружает мою программу, не перепроектируют ее. Я понимаю, что распространение файла.jar крайне небезопасно.
Кто-нибудь может порекомендовать независимый от платформы способ распространения моего Java-приложения? Также я хотел бы установить его как сервис на любую платформу (Windows, Linux, Mac OSX).
Спасибо!
7 ответов
Вы можете зашифровать / скрыть свой байт-код с помощью yGuard или других java-bytecode-obfuscators.
Независимое распространение операционной системы может быть затруднено. ИМХО, лучшим решением является обычный архив, содержащий несколько сценариев (.bat /.cmd для windows,.sh для linux / OSX) для запуска программы в операционных системах, которые поддерживает программа.
Запуск java-программы в качестве службы может быть еще более сложным: это просто в Linux, где вам просто нужно написать подходящий скрипт запуска для запуска в фоновом режиме. Я знаю, что у FireDaemon есть проблемы с запуском java-программ в качестве службы, поэтому может быть сложно (или невозможно) запустить его как службу в Windows. Извините, но я понятия не имею о MacOS X. Может быть так же просто, как Linux, может быть так же невозможно, как Windows.
Как уже говорили другие, вы можете запутать свой код. Это сделает обратное проектирование нетривиальным. Вы также можете скомпилировать Java в нативный код, используя (например) GCJ. Это усложнит реверс-инжиниринг, но это также будет означать, что вам придется создавать разные дистрибутивы для каждой поддерживаемой аппаратной / операционной платформы.
Я понимаю, что распространение файла.jar крайне небезопасно.
Вы должны понимать, что если вы распространяете программное обеспечение в любой форме для работы на платформе, которую вы не полностью контролируете, то вы ничего не можете сделать, чтобы предотвратить реверс-инжиниринг. Ничего такого.
В конечном счете, вы должны найти компромисс между преимуществами распространения вашего программного обеспечения и рисками, которые кто-то может изменить. Один из подходов, который используют люди, заключается в том, чтобы выяснить, перевешивают ли выгоды риски *, и использовать правовые гарантии (например, соответствующие лицензии на программное обеспечение) для предотвращения обратного инжиниринга. Другой подход - сказать "удачи вам" потенциальным реверс-инженерам и заработать деньги, предлагая услуги, а не лицензии на программное обеспечение.
Запуск вашего приложения через обфускатор делает реверс-инжиниринг более сложным и дорогостоящим.
Взгляните на Java Service Wrapper для относительно простого способа установки и запуска вашего Java-приложения в качестве службы на нескольких платформах.
Рассматривали ли вы использование собственного компилятора кода, такого как GCJ? Он не зависит от платформы (вам нужно будет скомпилировать его для каждой целевой платформы), но я не понимаю, как вы можете распространять независимый от платформы байт-код и все же скрывать этот байт-код от ваших конечных пользователей.
Вы можете запутать это. Это сделает реверс-инжиниринг вашей программы более сложным. Кроме того, я думаю, что вы можете сделать ваши файлы классов исполняемыми (т.е..exe для Windows) тоже
РЕДАКТИРОВАТЬ: если честно, если безопасность вашего приложения так важна, лучше всего избегать Java. Например, вы можете использовать компилятор gcc для C++ (который более или менее независим от платформы, если вы не делаете системные вызовы). Вам просто нужно скомпилировать его на разных хост-машинах (это то, что ваш первоначальный вопрос указывает на то, что вам нужно, но на Java).
Существует также Qt, но я сам не пробовал.
Вы можете зашифровать банку, но тогда вам нужно будет написать собственный загрузчик классов для загрузки содержимого баночки. Это все еще не на 100% надежно - простой факт заключается в том, что ничего, что вы можете сделать, сделает ваш код на 100% безопасным, если он нацелен. Смотрите это обсуждение здесь.
Или вы можете сделать то, что я сделал. java-интерфейс с некоторыми бэкэнд-функциями, написанными на C++, скомпилированными в dll, вызываемую через JNI. Интерфейс GUI полностью переносимый, с внутренним хрюканством, выполненным на родном языке.