Как можно защитить проект на Java от простого копирования?
============================================================

 Доброго времени суток!  

  

В процессе разработки столкнулся с проблемой защиты данных от копирования.  

Есть Restful серверное приложение, написанное на Java (jar файл) с базой данных (крутится на том же сервере).  

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

Однако имея полный доступ к серверу ничего не помешает ему скопировать jar-файлы и продать их кому-то.  

  

До этого никогда не сталкивался с ситуацией когда сам пытаюсь продать свои результаты труда и как-то защитить их от свободного распространения.  

Подскажите, пожалуйста, какие есть методики защиты подобного программного обеспечения?  

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

  

И есть ли возможность скомпилировать jar-файл как-то так чтобы его нельзя было декомпилировать? 

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

  

Но если всё же необходимость защитить есть, то к вам в копилку могу подкинуть ещё 1 вариант:  

- генерите аппаратный ID машины (не уверен, что можно напрямую из Java, но наверняка есть варианты, например, на C++ с возможность прокинуть их в Java)  

  

а дальше уже варианты:  

1) Можно просто каждый раз проверять ID машины и запускать если он тот же, в противном случае блокировать запуск  

2) Можно предложить пользователю передать вам ID машины, для того, чтобы вы сообщили ему ключ активации (ключ может быть получен каким-либо преобразованием ID-машины).  

  

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

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

  

Затруднить декомпиляцию программы можно воспользовавшись AOT-компилятором, но это снизит переносимость программы и в некоторых сценариях использования может снизить её производительность.  

  

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

 Признаюсь, этот вопрос интересует меня так же.  

Если бы мне пришлось реализовывать подобное, то я:  

- решил бы вопрос юридически  

- провел бы обфускацию кода ( <https://www.guardsquare.com/en/products/proguard> )  

- для использования софта использовал бы активацию на собственном сервере  

- при активации софта учитывал бы определенные системные параметры (id железа и т.д.) и сохранил бы на своем сервере при активации софта. 

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

В технической : обфусцировать код и добавить ключ активации.  

Сильно защищать смысла нет.  

Ибо, всегда можно показать в споре исходники. Всегда нужна поддержка, а без разработчика её очень трудно сделать. 

 Минимум - [зарегистрировать права](https://rospatent.gov.ru/ru/stateservices/gosudarstvennaya-registraciya-programmy-dlya-elektronnyh-vychislitelnyh-mashin-ili-bazy-dannyh-i-vydacha-svidetelstv-o-gosudarstvennoy-registracii-programmy-dlya-elektronnyh-vychislitelnyh-mashin-ili-bazy-dannyh-ih-dublikatov) 

 Всем спасибо большое за ценные советы и рекомендации!   

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

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

Решил более пристально посмотреть в сторону привязки к ID машины (либо интерфейса) в комбинации с периодическим шифрованным обменом с сервером верификации.   

Также натолкнули на мысль что можно делать уникальные сборки под каждого потребителя с уникальными идентификаторами-подписями.