Я собираюсь продать программу, которую написал на C#, и хочу строго контролировать ее лицензии. Это означает, что я хочу, чтобы клиент подключался к моему серверу каждый раз, когда он запускается. Это также дает мне возможность отключать ключи (на случай возвратных платежей в PayPal или распространения кода). Конечно, это может быть проблемой для других пользователей, но в данном случае это необходимо. Поскольку мне не удалось найти хороших систем лицензирования .NET, которые не были бы взломаны, я решил попробовать написать небольшую систему самостоятельно. Мой план состоял в том, чтобы сделать следующее:
- Сгенерируйте key.dat, содержащий 1024 символа, который поставляется с программным обеспечением (индивидуально для каждого пользователя).
- В точке входа приложения добавьте httprequest на мой сервер, который отправляет key.dat + текущую временную метку в зашифрованном виде.
- Мой HTTP-сервер (под управлением PHP) расшифровывает запрос и проверяет, действителен ли ключ (в моей базе данных), и отвечает «уровнем доступа» (тип лицензии). Если ключ недействителен или отключен, он отвечает кодом ошибки. Как и в случае с запросом, ответ сопровождается отметкой времени, поэтому кто-то не может проверить свою программу, отправив себе действительный пакет. Отметка времени проверяется в клиенте. Ответ шифруется с помощью RSA и ранее сгенерированного открытого ключа.
- Клиент получает ответ, расшифровывает с помощью закрытого ключа и реагирует.
Является ли RSA правильным подходом для этого, чтобы я мог гарантировать, что пакеты отправляются мной, а не созданы (никто другой не имеет открытого ключа)? Есть ли лучший подход для решения этой проблемы?