Здравствуйте, Дмитрий Писаренко, Вы писали:
ДП>Я думал использовать obfuscator.
Из бесплатных proguard, из платных ZKM.
ДП>Возможно, имеет смысл вставить механизм проверки не только на старте, а во многих разных местах. Или запускать механизм проверки время от времени, через случайные интервалы времени.
Не надо ничего придумывать. Принцип простой. Прада ломается тоже на ура.
Берете и разбиваете ваш JAR на два — основное приложение и специальный класслоадер.
И ClassLoader и JAR основного приложения скремблируете так, чтобы имена классов пересекались, чтобы при декомпиляции были методы и поля с одинаковыми именами, чтобы все модификаторы менялись на private. Кароче, чтобы максимально обезопасить себя от перекомпиляции. Убирайте все строковые константы из ClassLoader — делайте из них byte[] и так храните в коде, напишите функцию, чтобы строки получались из byte[] в runtime -- это максимально затруднит поиск по строке "License Expiried" и т.п.
Класс лоадер имеет у себя открытый ключ (лучше хранить его также в byte[], причем использовать для него специальную скремблирующую функцию), точней часть ключа. Вторая часть защивается в лицензионный ключ, выдаваемый хорошему пользователю тайно. JAR шифруется по SHA алгоритму закрытым ключом. И грузится через этот ClassLoader. При совпадении ключей ClassLoader сможет расшифровать и загрузить классы из основного JAR.
Уезвимость одна. С хорошим ключом можно написать плохой ClassLoader который расшифрует вам JAR, дальше просто...