Положение
Рассмотрим стандартное программное обеспечение с множеством функций, а отдельные корпоративные клиенты приобретают лицензии на подмножество всех доступных функций. Для простоты разработки и развертывания все функции всегда присутствуют: все клиенты получают один и тот же установщик с индивидуальным списком функций с указанием доступных функций. Каждый клиент (пользователь) имеет отдельный контракт на программное обеспечение, поддержку и обычно каждый клиент подписывает один или несколько дополнительных контрактов каждый год для получения новых функций (либо разработанных по требованию, либо тех, которые стали доступны после подписания первоначального контракта).
Проблема
Нам необходимо исключить возможность активации функций, не предусмотренных договорами (и оплаченными) с клиентом. Для нас это сводится к блокировке файла определения функции, так что он не может быть возиться с.
Технические данные
На данном этапе нам нужна только проверка в автономном режиме, без сервера лицензирования или онлайн-проверок.
Приложение имеет традиционную архитектуру сервер-клиент, сервер написан на C ++, клиент - это веб-сайт, который общается с сервером через HTTPS. Все наши клиенты используют Windows Server (разных винтажов). Мы используем Atlassian Bamboo для CI и в качестве сервера сборки для сборки пакетов установки MSI с WIX.
Никто в команде не имеет никакого опыта в криптографии, кроме использования библиотеки OpenSSL для TLS и наличия наших собственных ЦС для разработки и развертывания. Мы не знаем, что доступно, например, из Windows, это поможет или даже предназначено для этой задачи.
Юридические данные
Все наши нынешние клиенты играют хорошо и очень готовы к сотрудничеству. Большинство наших клиентов находятся в Германии, все они в Европе (на данный момент), подпадают под хорошую правовую систему (которая является основным рычагом в этом, лицензирование функции является вторичным). Нам нужно реализовать лицензирование функций в основном для галочки, чтобы избежать возможных неприятных сюрпризов в будущем. Мы не проводим аудит у наших клиентов.
Наша текущая идея
Наша текущая идея состоит в том, чтобы либо зашифровать или подписать файл функции нашим закрытым ключом (по аналогии с подписью сообщения PGP), включить наш открытый ключ в саму программу и проверить подпись / расшифровать файл лицензии при запуске. Мы знаем о возможности изменения открытого ключа в двоичном файле программы и повторного шифрования нового файла лицензии. На сегодняшний день это выходит за рамки сложности наших клиентов, за исключением возможного сценария использования готового программного обеспечения, которое сможет сделать это простым и удобным для пользователя способом.
Вопрос
Имеет ли наш подход смысл? Или есть какой-то стандартный способ сделать это, которого мы не смогли найти?