Безопасный алгоритм создания лицензионных ключей?
Я хотел бы распространять приложения, но у меня есть лицензионный ключ, который они могут ввести для разблокировки. Какой хороший алгоритм для создания краткого ключа, который содержит информацию о том, какую версию они приобрели, а также дополнительные вещи, такие как срок действия лицензии и т. Д.
Я понимаю, что эту защиту можно взломать, но она делает честных людей честными. Я могу или не могу реализовать онлайн-активацию, но в основном меня интересует хороший способ генерации этих ключей.
Мы все видели эту ситуацию, какой алгоритм работает лучше всего? Должен ли я запросить имя пользователя в виде открытого текста и использовать его для создания уникального ключа продукта, основанного на его собственной информации?
Есть ли система, которую можно использовать, чтобы практически невозможно сгенерировать действительный ключ?
Возможно, ситуация шифрования с парой открытых / секретных ключей, когда закрытый ключ есть только у производителя, и данные могут быть проверены с помощью открытого ключа, но открытый ключ не может быть взломан для создания действительных ключей.
Так как это ключ продукта, было бы здорово, если бы он был достаточно коротким, 64 символа или, возможно, не более 128 символов, но чем короче, тем лучше, 32 или меньше, было бы здорово.
2 ответа
Вы не сказали, на какой платформе вы находитесь, но вот в Microsoft.Net:
http://jclement.ca/devel/dotnet/reallysimplelicensing.html
На этой странице описана очень простая схема лицензирования, которую вы можете использовать со своим приложением.NET. Он должен быть достаточно безопасным, простым в реализации и легко расширяемым. Образец версии позволяет вам предоставлять файлы лицензий со встроенным в них именем клиента, но вы можете легко расширить его, добавив другую идентифицирующую информацию, привязки машины, даты истечения срока действия и т. Д.
Эта схема использует библиотеку Microsoft RSA и XML-подписи. По сути, вы помещаете все, что хотите, в документ XML и подписываете этот документ. Затем вы можете предоставить этот файл своему клиенту, и приложение сможет прочитать информацию о лицензии из этого файла. Поскольку файл имеет цифровую подпись, файл лицензии НЕ может быть подделан, пока вы не отпустите свой закрытый ключ (что вам действительно не следует делать).
Нет доступа в Интернет и ключи
Что касается размера серийного ключа, существует компромисс между короткими / удобочитаемыми ключами (менее безопасными) и наличием длинных ключей или, возможно, файлов лицензий (более безопасными).
Если вам нужны короткие и удобочитаемые ключи, которые позволяют хранить такие вещи, как дата истечения срока действия и функции, вы можете использовать SKGL вместе с Software Protector, которые оба имеют открытый исходный код ( https://help.cryptolens.io/faq/what-is-skgl).
Однако недостатком является то, что они, скорее всего, будут использовать симметричную криптографию и / или хранить алгоритм генерации ключей внутри приложения. Это означает, что конечный пользователь может попытаться найти ключ шифрования и / или алгоритм (см. http://www.codeproject.com/Articles/764610/Licensing-systems-in-NET).
Доступ в Интернет (или в автономном режиме с файлами активации)
Лучшей альтернативой является использование облачной системы, которая отслеживает все лицензионные ключи и позволяет изменять их в любое время.
Если у вас есть веб-система лицензирования, вы можете держать ключи короче и не должны хранить информацию внутри фактического ключа (что имеет место в большинстве автономных систем).
Более того, вы сможете поддерживать больше моделей лицензирования, например, модель на основе подписки.
Решения:
создайте такую систему самостоятельно - это займет много времени и отвлечет вас от основных функций приложения.
используйте существующую систему с открытым исходным кодом в качестве отправной точки - хотя это может показаться заманчивым, поскольку она имеет открытый исходный код и является бесплатной, потребуется время, чтобы перенести их в облако, настроить ее в соответствии с вашими потребностями + поддерживать ее. системы с открытым исходным кодом, которые я наблюдал, имеют тенденцию быть очень широкими по функциональности, что способствует сложности.
отдавать на аутсорсинг третьей стороне - недостатком является то, что большинство из них не являются бесплатными.
На мой взгляд, вся процедура должна быть передана третьей стороне, которая специализируется на разработке этого конкретного компонента. После масштабирования может потребоваться изменить логику лицензирования. Вместо того, чтобы разрабатывать его самостоятельно, скорее всего, третья сторона уже поддерживает этот сценарий.
Есть несколько решений (не забудьте найти те, которые основаны на сети), Cryptolens является одним из примеров. Если вы разрабатываете приложение.NET, вот пошаговый пример: https://help.cryptolens.io/examples/key-verification.
Отказ от ответственности: я являюсь автором SKGL/Software Protector, статьи о системах лицензирования и Cryptolens.