2009-02-11 3 views
16

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

+4

Ваш дизайн испорчен; отправка конфиденциальных данных вместе с кодом не является умной идеей. – Rob

+0

Это настольное приложение. Java используется для совместимости между платформами. –

+3

Если вам нужно защитить данные, рассмотрите SqlCipher. Вы можете отправить файл DB, который уже зашифрован, если хотите. –

ответ

20

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

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

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

2

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

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

1

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

7

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

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

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

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

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

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

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

+0

теперь я понимаю, когда я использовал Ericsson TEMS, почему мне приходилось использовать USB-ключ все время, чтобы запустить его, на удивление, у usb не было данных, но он не будет работать без него – Johnydep

3

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

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

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

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

9

Я согласен с 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.

Смежные вопросы