Как правильно спроектировать сервис лицензирования?
Есть программа, на которую хочу выдать лицензии(ключ доступа).
Хочу создать отдельный сервис для выдачи ключей.
Ключи будут хранить данные о владельце и уровни доступа(количество отправляемых сбщ, количество одновременно авторизованных пользователей) и дату истечения.
В каком виде выпускать ключи и как проверять их в основной программе? Т.е. мне ключ шифрования хранить в основной программе тоже или при каждом запуске программы отправлять запрос на проверку в сервис лицензирования?
Если я захочу аннулировать ключ или отредактировать доступы доступы, что тогда?
Берём ассиметричное шифрование. Держим приватный ключ на сервере, а публичный зашиваем в программу. Ключ представляет из себя шифрованный приватным ключом текст, содержащий инфу о лицензии. Например, json с полями "номер лицензии", "срок протухания". При запуске проверять срок протухания и сравнивать с текущим временем. В принципе, пользователь может переводить часики, но это сильно неудобно. Особенно если программа представляет возможность работы по сети и коммуникации с другими людьми (а по описанию похоже на то, что так и есть).
Можно в лицензию записывать характеристики системы, на которой запущено приложение. А также все ограничения. Поменять их пользователь всё равно не сможет: даже если ему удастся выдрать открытый ключ, при изменении содержимого лицензии он не сможет её зашифровать приватным ключом).
Можно выдавать короткоживущие лицензии, которые обновлять по сети время от времени. При этом можно сделать примерно как в jwt, где есть долгоживущий refresh token и относительно недолго живущий access token.
Да чего уж там, можно просто при запуске приложения обращаться на сервер за криптографически валидным ответом (шифруем открытым ключём запрос и только по валидному ответу запускаем программу).
Можно вынести функционал проверки лицензии в launcher, который будет запускать основную программу только после проверки, что она не изменилась на диске, передавая ей какие-то правильные параметры, криптографически связанные, например, с регулярно изменяемым содержимым какого-нить файла. И дальше развивать идею: сделать "античит", который будет проверять, что программу не пытаются ломать.
В общем, можно очень много навертеть при больщом желании...
Но часто не нужно никакой сильно сложной и замороченной проверки. Софт немассового применения - тем более для бизнеса - обычно покупают вместе с поддержкой. Особенно критичный, простой которого крайне нежелателен. Ну потому что фиг его знает как он будет глючить. А если заглючит - то не будет миллиона комментариев на хабре и stackoverflow о том, как это решать. Чаще всего достаточно просто проверки зашифрованной лицензии, можно даже запрос на сервер не делать (тем более во многих сурьёхных фирмах сторонний софт "in-house" запускают в коонтуре без доступа в интернет в целях безопасности).
Хотите сделать свой аналог ключей Guardant или Sentinel?
Ну так откройте их доки и параграф за параграфом повторяйте.
Все что вы спрашиваете, у них детально расписано.
Я бы порекомендовал его серийник проверять онлайн каждый запуск.
Проверки должны быть рассыпаны по всей программе а не только при старте.
Добавьте больше трэша и устраивайте рандомные проверки, что бы не расслаблялись и за 1 раз не сняли.
Если ваш язык позволяет динамический код, то создавайте код динамически.
Если ваш язык позволяет то делайте антиотладку.
Если ваш язык позволяет делайте динамические переходы (только шифруйте вызовы)
Ну на самом деле самое злое, что можно сделать - вынести часть кода программы на сервер. Не полноценный онлайн сервис, чтоб сервер зря не грузить, просто какой-нибудь легко обрабатываемый но необходимый кусочек кода, желательно такой чтоб отреверсить чисто по выводу легко не получилось.:)
Вообще конечно киберпанк так и прёт, прям вижу класичексий DataCrash когда все дрм сервера просто сдохнут и человечество откатится на 50-100 лет назад тупо из-за невозможности ничего использовать.:)