Вопросы по licensing api SLK и привязке к оборудованию

Здравствуйте, в нашей компании возникла задача защитить от копирования код на java. Т.е. даже скопировав жесткий диск на низком уровне не должно быть возможности пользоваться ПО без ключа. После изучения и экспериментов с Guardant Licensing Api и Guardant Station стало ясно, что теоретически это возможно.

Но с моментом копирования диска возникли вопросы, т.к при клонировании виртуалки Ubuntu 20.04 в VirtualBox, защищенное приложение так же успешно запускалось. Клонировали разными способами, если в этих виртуалках активировали серийные номера, в GS было видно в данных оборудования, что менялись HDD и/или материнская плата. (Проверяли на виртуалках, т.к физически клонировать диск сложнее и дольше)

Посмотрев переписку с вашим менеджером по работе с клиентами увидел, что он в самом начале писал "Тестирование проводится на программных ключах. Архитектурно они аналогичны аппаратным и будущем легко могут быть легко заменены на них. Единственное послабление – в демо-ключах отсутствует привязка к конфигурации компьютера." Поэтому перед тем как написать ему по поводу получения/покупки настоящих программных ключей, решил спросить здесь, правильно ли мы используем guardant api.

Вопросы:
1) Правда ли, что на демо ключах проверить привязку ключа к оборудованию невозможно, но на реальных программных ключах она работает?

2) Правильно ли мы используем api? (рассматриваем вариант лицензии без ограничений и онлайн активацию)

а) сначала вызываем LicenseActivator.Activate, куда передается серийный ключ.
б) При запуске приложения ищем лицензию через api.GrdGetLicenseInfo
в) Создаем объект компонента grdlic.Feature , передав его номер (id)
г)  вызываем feature.Login, куда надо передать объект с кодами доступа GrdVendorCodes с публичным ключом вендора и приватным чтения
д) вызываем метод feature.Check куда передаем публичный ключ компонента. Ждем успешного кода
е) При завершении работы приложения вызываем feature.Logout

3) Если по первому вопросу ответ, что на демо ключах привязка не работает, но на реальных - да, то в какой момент проверяется, что оборудование поменялось и лицензия сломана? На момент поиска лицензий/логина/check? Или оно происходит фоном/может нужно еще какой-то метод в апи вызвать? Нужен ли доступ в интернет при этом?

4) Во враппере grdlic_java.jar в классе api я увидел метод

public static native int GetHostFingerprint(GrdString fingerprint, String host, int port);

Я думал вызывать этот метод при активации лицензии, сохранять значение в ячейку памяти и при каждом старте приложения сопоставлять значения, но я не могу этого сделать, т.к при вызове метода летит UnsatisfiedLinkError (в метод передавал пустой GrdString, "localhost", 0).
И я догадываюсь, почему летит ошибка:
В файле include/grdlic/grdlic.h есть только метод

int GRD_API GrdGetHostFingerprint(char** hostFingerprintJsonArray, const char* visibilityJson);

и у него отличная от враппера сигнатура. Даже если этот метод окажется мне ненужным, может вы посмотрите/почините этот метод в следующих релизах (вижу проблему и в 3.3 и в 3.5)

Re: Вопросы по licensing api SLK и привязке к оборудованию

Добрый день.
1) Правда ли, что на демо ключах проверить привязку ключа к оборудованию невозможно, но на реальных программных ключах она работает?
Да, все верно. В демо ключах механизм привязки отключен.
Но все же защититься от копирования лицензии в виртуальной машине будет сложно даже с боевыми ключами. В момент активации лицензии вычисляются числовые значения, характеризующие каждый элемент рабочей станции, отмеченный для привязки. В процессе работы API эти же значения регулярно проверяются. Именно изменение таких значений будет влиять на статус лицензии. То есть, если при копировании виртуальной машины ни одно из таких значений не изменится (что теоретически возможно, если скопированная виртуальная машина будет развёрнута на этом же гипервизоре), то и статус лицензии тоже не изменится.
На сколько мне известно, сегодня на рынке лицензирования программного обеспечения нет механизмов защиты от такого метода копирования лицензии. Однако, наша технология позволяет установить запрет на активацию лицензии в виртуальной среде. Запрет на активацию позволит полностью исключить возможно активации лицензии не виртуальных машинах, таким образом защитив лицензию от копирования.

2) Правильно ли мы используем api?
Да, все верно.
В составе Guardatn SLK есть примеры использования API (C:\Program Files (x86)\Guardant\Software Licensing Kit\samples). В примерах можно посмотреть порядок вызова функций.

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

4) Во враппере grdlic_java.jar в классе api я увидел метод
Этот метод используется не для активации, а для рехоста лицензии. А пример для активации лицензии с помощью API вы можете найти в составе Guardatn SLK (C:\Program Files (x86)\Guardant\Software Licensing Kit\samples\license_activation)

Re: Вопросы по licensing api SLK и привязке к оборудованию

Спасибо. Но по 4му пункту, посмотрите все равно пожалуйста. Вы предоставляете в апи этот метод, но он не может вызываться по описанным мной причинам (несоответствие сигнатур). Если этот метод не нужен для пользователей, тогда уберите его.