Фон
Мне нужно реализовать простой механизм лицензирования с блокировкой узла (т. Е. Лицензия должна быть действительной только для определенного физического компьютера).
Я намерен использовать асимметричный криптографический алгоритм, такой как RSA.
Вот как я собираюсь организовать базовый процесс лицензирования:
- Приложение, которое необходимо лицензировать, считывает фрагмент данных, который однозначно идентифицирует компьютер (на котором он в данный момент работает). Давайте назовем эти данные «вычисленным идентификатором» .
- Пользователь запрашивает лицензию, отправляя идентификатор компьютера.
- На основе идентификатора компьютера лицензия создается и защищается (либо с помощью полного шифрования, либо с помощью подписи) и отправляется обратно пользователю.
- Затем приложение может сравнить лицензию с фактическим идентификатором компьютера и отказаться от запуска, если они не совпадают.
Обратите внимание, что идентификатор компьютера не будет особенно чувствительным (вероятно, это просто MAC-адрес и, возможно, последовательный порт HD) и сам по себе не представляет собой секрет.
Вопрос
Передо мной стоит дилемма:
- шифровать идентификатор компьютера (как в запросе лицензии, так и в самой лицензии),
- или включить его в виде простого текста (как в запросе, так и в лицензии) и просто добавить подпись (в лицензии).
(1) Если я выберу полное шифрование, мне понадобятся две пары открытых / закрытых ключей - по одной для каждого направления (по одной для шифрования запроса и дешифрования перед генерацией лицензии, и одной для шифрования и дешифрования лицензии). это по заявке).
(2) Если я решу использовать подпись, мне просто понадобится один ключ - частный ключ для подписи лицензии и открытый ключ для проверки подписи при запуске приложения (поэтому он знает, что идентификатор компьютера в виде простого текста в лицензии не изменился ).
Подход (2) мне кажется проще, но настолько ли он силен, как (1)?
Я внедряю это в C #, но мне хотелось бы получить общие рекомендации высокого уровня о плюсах и минусах каждого подхода, независимо от деталей реализации.