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

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

6 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

NB Я генеральный директор в Licel LLC. Разработчик Stringer Java Obfuscator.

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

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

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

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

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

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

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

Другие вопросы по тегам