Подтвердить что ты не робот

Как создать зашифрованный файл Jar?

Я работаю над проектом, который должен защищать данные (раскрытие кода не является основной проблемой). Мы используем Java + Netbeans. Есть ли какое-либо средство, которое создаст банку в зашифрованном формате? Мы также используем sqlite для базы данных - поэтому размещение текстового файла в зашифрованном формате для нас тоже не является подходящим вариантом.

4b9b3361

Ответ 1

Создание зашифрованных JAR файлов невозможно, поскольку исполняемый JavaVM должен как-то считывать данные, которые он хочет выполнить. И подобно VM, для всех, у кого есть необходимые инструменты и ноу-хау, можно извлечь все данные из JAR.

Если бы можно было зашифровать JAR, вам также необходимо предоставить ключ дешифрования или средство для клиента, который хочет выполнить JAR, который вообще побеждает цель шифрования.

Лучшее, что вы можете получить, это обфускация, но это не настоящая безопасность или препятствие для амбициозного злоумышленника.

Ответ 2

Я согласен с Kosi2801. Шифрование файлов классов - это просто имитация безопасности (см. http://www.excelsior-usa.com/articles/java-obfuscators.html) Использование пользовательского ClassLoader может привести к поломке приложения, например. в серверах приложений.

Существует лучший способ: использовать шифрование String-констант в файлах классов. Большинство коммерческих обфускаторов имеют эту функцию, например Allatori, Stringer Java Obfuscation Toolkit, Zelix KlassMaster, Smokescreen, DashO (супер дорого). Stringer Java Obfuscator имеет функции проверки контекста и контроля целостности, которые сильно затрудняют защиту.

Самый безопасный способ - хранить и выполнять части байт-кода на внешнем устройстве, таком как JavaCard.

N.B. Я генеральный директор компании Licel. Разработчик Stringer Java Obfuscator.

Ответ 3

Kosi2801 в значительной степени прав. Единственное, что я могу думать о вас, это сделать, но это уродливо.

  • Отправляйте небольшой стандартный JAR и зашифрованный файл данных.
  • Когда JAR запускается, он расшифровывает (некоторые) зашифрованные файлы данных в память (например, каталог, где данные находятся в JAR, в основном простая файловая система в области пары указателей/длины)
  • Создайте свой собственный загрузчик классов, который при вызове получает правильные зашифрованные байты из JAR (используя таблицу псевдо-FS, описанную в № 2), расшифровывает его, а затем загружает данные класса из

Это позволит вам загружать классы. Вы можете сделать то же самое (без загрузчика классов) для загрузки других ресурсов.

В то время как интересно реализовать (для тех, кто любит вызов), есть несколько проблем с этим:

  • Вам нужно будет расшифровать материал, чтобы пользователь мог либо вводить пароль каждый раз, либо что-то подобное. Если JAR знает достаточно, чтобы расшифровать его сам, тогда любой может посмотреть на него и выяснить, как расшифровать вещи. Это можно было бы смягчить, связавшись с известным сервером через Интернет, чтобы запросить ключ дешифрования (если вы сделаете этот процесс безопасным). Конечно, для этого требуется активное "сетевое соединение", когда кто-то хочет запустить программу.
  • Все заканчивается в памяти. Без пользовательской JVM, которая обрабатывает крошечные биты зашифрованного байтового кода (как упоминал Кэмерон Маккей), классы в какой-то момент будут дешифрованы, сидя в основной памяти. Если вы не полагаетесь на ОС, чтобы другие люди не читали эту память, вы уже проиграли битву никому, у которой мало времени на их руках. Такая же проблема для ресурсов (например, изображения/шрифты/etc), которые вы пытаетесь прочитать из некоторого зашифрованного хранилища.

Итак, вы можете дать людям обход и сделать все сложнее, но в ситуации, которую вы дали, все, что вы можете сделать, это попытаться сделать так, чтобы не стоило другому человеку инвестировать.

Защита программного обеспечения жесткая, особенно в Java, которую можно легко декомпилировать и не может изменить собственный код, например C/Assembly. Существует причина, по которой некоторые из самых дорогих программ там требуют аппаратных ключей или блокируются определенным процессором или другим оборудованием.

Ответ 4

В общем, нет способа сделать это безопасным способом, если вы хотите, чтобы приложение и его данные были автономными. Тем не менее, вы можете, конечно, зашифровать файлы и децитировать их с помощью ключа, закодированного в коде. Определенный хакер может это получить, но если это не то, о чем вы беспокоитесь, тогда это прекрасно. Если вы это сделаете, помните, что кодированные данные не могут быть сжаты, поэтому сначала сжимайте, а затем зашифровывайте.

Если вам действительно нужны защищенные данные (например, конфиденциальные данные), вам нужно будет зашифровать данные с помощью ключа и предоставить этот ключ для приложения моим некоторым внешним средствам, например, положить его на большой палец и получить что для пользователя с помощью безопасного курьера.

Другая возможность сделать данные (или ключ) доступными через SSL и использовать хороший метод проверки подлинности, чтобы проверить, кто ваш пользователь.

В целом - невозможно, чтобы какая-либо система была абсолютно безопасной, но она также не нужна. Система должна быть достаточно безопасной, чтобы препятствовать атакующим, которые, по вашему мнению, будут пытаться ее взломать.

Ответ 5

Другой вариант - создать пользовательскую JVM, которая расшифровывала JAR на лету. Но та же проблема остается: в какой-то момент классы JAR Java должны быть дешифрованы для запуска JVM, и в этот момент их можно захватить и скомпилировать.

Не говоря уже о том, что использование пользовательской JVM потребует от всех ваших пользователей загрузки этой JVM.

Ответ 6

Вы можете использовать CipherOutputStream и CipherInputStream для сериализации объектов Java на диск в зашифрованном формате. Это может открыть опцию для сохранения данных.