Сервис лицензирования для 3D-принтера

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

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

Запрос

Некоторое время назад мы принимали участие в проекте по разработке 3D-принтера. В какой-то момент заказчик задумался о том, как именно он сможет распространять свой продукт, когда будет готов выпустить его на рынок. Было решено продавать его по подписке.

Перед командой КЕДР Solutions стояла задача разработать сервис лицензирования и необходимые для него компоненты, способные блокировать и разблокировать на определенный срок те или иные функции устройства в зависимости от типа лицензии.

Решение

Состав системы

В состав системы входят три компонента: веб-сервер, десктопное приложение для активации лицензии и микроконтроллер устройства.
Компоненты сервиса лицензирования, разработанного командой КЕДР Solutions.
1. Десктопное приложение

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

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

2. Микроконтроллер

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

3. Веб-сервер

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

Jmix представляет собой платформу для быстрой разработки веб-приложений на языке Java. За счет использования декларативного подхода и широкого выбора готовых инструментов разработка в Jmix занимает меньше времени, а значит, обходится заказчику дешевле. Кроме того, Jmix поддерживает современные веб-технологии, такие как HTML5, CSS3 и JavaScript, что позволяет создавать приложения с привлекательным и интуитивно понятным интерфейсом. В то же время фреймворк основан на Java и Spring Framework, что обеспечивает высокую масштабируемость и производительность приложений.

Отдельные элементы интерфейса пришлось скорректировать с учетом специфики работы программы: потребовалось добавить дополнительные проверки для вводимой в БД информации. Поэтому интерфейс пришлось кастомизировать непосредственно в коде на Java.

Для выдачи и предоставления данных лицензий клиентским приложениям потребовалось создать отдельный модуль, используя возможности HTTP-сервера Jmix на языке программирования Java. Модуль реализует REST API протокол для обслуживания HTTP-запросов. Он был встроен в HTTP-сервер Jmix.

Команда также разработала протоколы общения между приложением и устройством, а также между приложением и сервером.

Процесс лицензирования

Механизм лицензирования был устроен следующим образом.
Логика работы сервиса лицензирования, разработанного компанией КЕДР Solutions.
1. После оплаты подписки на приложение пользователя приходит лицензионный ключ. Он представляет собой номер строки в базе данных, в которой будет хранится информация о лицензии и лицензируемом устройстве.

2. Получив лицензионный ключ, приложение запрашивает у микроконтроллера устройства серийный номер и тип изделия, а также версию его текущей прошивки, которые выступают в качестве идентификатора устройства.

3. Эта информация отсылается на веб-сервер, где заносится в базу данных.

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

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

Как происходит валидация лицензии

Для проверки подлинности лицензии мы решили использовать цифровую подпись, формируемую алгоритмом хеширования SHA-256. В основе этого алгоритма лежит хеш-функция, которая может преобразовать любое сообщение или данные в фиксированную по длине строку символов (хеш, или хеш-сумму). Хеширование имеет следующие особенности:

1) Идентичные входные данные всегда преобразуются в идентичные значения хеша.

2) Хеш-суммы имеют фиксированный размер независимо от размера входных данных.

3) Хеширование – всегда однонаправленный процесс. Любое сообщение можно преобразовать в хеш, но вычислить исходные данные из хеша невозможно.

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

Одна из уязвимостей хеширования заключается в вероятности коллизий – явлении, когда два разных сообщения генерируют идентичные хеш-суммы. Однако у алгоритма SHA-256 она составляет около 10-76.

Теоретически остается возможность подобрать правильный хеш методом полного перебора (brute-force attack), однако на практике такой взлом потребует неадекватного количества времени.

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

Выполненные работы

  • Доработка десктопного приложения
  • Проектирование и разработка системы лицензирования устройства
  • Разработка веб-приложения на Jmix
  • Разработка протоколов общения между веб-приложением и настольным приложением, а также между настольным приложением и микроконтроллером устройства

Использованные технологии

  • Веб-приложение было разработано на языке Java с помощью фреймворка Jmix.
  • Десктопное приложение написано на С++ с использованием фреймворка Qt.
  • В качестве метода шифрования в проекте использовался алгоритм хеширования SHA-256.

Итоги

Команда КЕДР Solutions создала систему лицензирования для 3D-принтера, позволяющую распространять продукт по подписке. Для этого мы доработали десктопное приложение, через которое пользователь может активировать устройства, а также разработали Jmix-приложение, в котором генерируются ключи и хранятся данные лицензии.

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

Наша разработка позволила:

  • Начать распространять продукт по подписке, предлагая каждому клиенту наиболее подходящий ему набор функций и срок работы устройства, а также создать различные ценовые модели для различных категорий пользователей.
  • Обеспечить компании постоянный и предсказуемый доход и повысить лояльность клиентов
  • Защитить продукт от несанкционированного использования.
  • Начать сбор данных об использовании продукта, чтобы лучше понять целевую аудиторию и усовершенствовать продукт в будущем.
Бюджет проекта:
2 200 000 руб.
Срок проекта:
2,5 месяца