Как создать ключ продукта для моего приложения C #?

Как создать ключ продукта для моего приложения C #?

Мне нужно создать ключ продукта (или лицензии), который я обновляю ежегодно. Кроме того, мне нужно создать его для пробных версий.

Связанный:

  • Как лучше всего запутать код проверки лицензии на продукт C #?
  • Активация веб-лицензии
  • Как защитить свое программное обеспечение от незаконного распространения?
  • Лучшее программное обеспечение для активации приложений .NET?

Вы можете сделать что-то вроде создания записи, содержащей данные, которые вы хотите аутентифицировать в приложении. Это может включать в себя все, что вы хотите – например, функции программы для включения, дату истечения срока действия, имя пользователя (если вы хотите привязать его к пользователю). Затем зашифруйте это, используя некоторый криптоалгоритм с фиксированным ключом или хешем. Затем вы просто проверите его в своей программе. Один из способов распространения файла лицензии (в Windows) – предоставить его как файл, который обновляет реестр (сохраняет пользователя, который должен его набирать).

Остерегайтесь ложного чувства безопасности, хотя – рано или поздно кто-то просто исправит вашу программу, чтобы пропустить эту проверку и распространить исправленную версию. Или они разработают ключ, который передает все проверки и распространяет это, или отстает от часов и т. Д. Не имеет значения, насколько вы запутались в своей схеме, все, что вы для этого сделаете, в конечном итоге будет безопасностью через неясность, и они всегда будут быть в состоянии. Даже если они не смогут кого-то и будут распространять взломанную версию. То же самое относится, даже если вы поставляете ключ – если кто-то захочет, они могут исправить также чек. Цифровое подписание кода не поможет, они могут удалить эту подпись или уйти в отставку.

Вы можете немного усложнить ситуацию, используя методы предотвращения работы программы в отладчике и т. Д., Но даже это не является доказательством пули. Поэтому вы должны просто сделать это достаточно сложно, чтобы честный пользователь не забыли заплатить. Также будьте очень осторожны, чтобы ваша схема не стала навязчивой для пользователей – лучше иметь некоторые копии с копиями, чем для ваших платежных клиентов, чтобы не использовать то, за что они заплатили.

Другим вариантом является онлайн-проверка – просто предоставите пользователю уникальный идентификатор и проверьте онлайн о том, какие возможности должен иметь идентификатор, и кешируйте его в течение некоторого периода времени. Все те же предостережения применяются, хотя – люди могут обойти все, что угодно.

Учитывайте также расходы на поддержку работы с пользователями, которые забыли свой ключ и т. Д.

edit: Я просто хочу добавить, не вкладывайте слишком много времени в это или думайте, что каким-то образом ваша запутанная схема будет отличаться и не поддаётся проверке. Это не будет, и не может быть до тех пор, пока люди будут контролировать оборудование и ОС, на которых работает ваша программа. Разработчики пытались придумать все более сложные схемы для этого, думая, что, если они разработают для себя свою собственную систему, то они будут известны только им и, следовательно, «более безопасны». Но это действительно эквивалент программирования, который пытается построить вечный двигатель. 🙂

Кому вы доверяете?

Я всегда считал эту область слишком критичной, чтобы доверять третьей стороне для управления безопасностью во время выполнения вашего приложения. Как только этот компонент взломан для одного приложения, он взломан для всех приложений. Это случилось с Discreet через пять минут, как только они пошли с сторонним лицензионным решением для 3ds Max несколько лет назад … Хорошие времена!

Серьезно, подумайте о том, чтобы катиться самостоятельно, чтобы иметь полный контроль над вашим алгоритмом. Если вы это сделаете, подумайте об использовании компонентов в своем ключе в соответствии с:

  • Имя лицензии – имя клиента (если есть), которое вы лицензируете. Полезно для управления развертываниями компаний – заставляйте их чувствовать себя особенными, чтобы иметь «персонализированное» имя в информации о лицензии, которую вы им предоставляете.
  • Дата истечения срока действия лицензии
  • Количество пользователей, работающих под одной лицензией. Это предполагает, что у вас есть способ отслеживать запуск экземпляров на сайте, на сервере
  • Коды функций – чтобы вы использовали одну и ту же систему лицензирования для нескольких функций и нескольких продуктов. Конечно, если он взломан для одного продукта, он взломан для всех.

Затем сверяйтесь с ними чертой и добавьте любое (обратимое) шифрование, которое вы хотите, чтобы сделать его более трудным для взлома.

Чтобы сделать пробный лицензионный ключ, просто установите значения для вышеуказанных значений, которые переводится как «пробный режим».

И так как теперь это, вероятно, самый важный код в вашем приложении / компании, поверх / вместо обфускации, подумайте о том, чтобы поместить процедуры расшифровки в собственный DLL-файл и просто P / Invoke к нему.

Несколько компаний, с которыми я работал, с большим успехом приняли обобщенные подходы к этому. Или, может быть, продукты не стоили взломать;)

Если вы спрашиваете о ключах, которые вы можете ввести, например, о ключах продуктов Windows, то они основаны на некоторых проверках. Если вы говорите о ключах, которые вы должны скопировать, то они основаны на цифровой подписи (шифрование с закрытым ключом).

Простой логический ключ продукта может состоять в том, чтобы начать с того, что ключ продукта состоит из четырех 5-значных групп, таких как abcde-fghij-kljmo-pqrst , а затем продолжим указывать внутренние отношения, такие как f + k + p, что означает, что первые цифры групп 2, 3 и 4 должны равняться a. Это означает, что 8xxxx-2xxxx-4xxxx-2xxxx действителен, поэтому 8xxxx-1xxxx-0xxxx-7xxxx. Конечно, были бы и другие отношения, в том числе сложные отношения типа, если вторая цифра первой группы нечетна, тогда последняя цифра последней группы также должна быть нечетной. Таким образом, генераторы ключей продукта и проверка ключей продукта просто проверили бы, соответствует ли это всем правилам.

Шифрование обычно представляет собой строку информации о лицензии, зашифрованной с помощью закрытого ключа (== с цифровой подписью) и преобразованной в Base64 . Открытый ключ распространяется вместе с приложением. Когда строка Base64 приходит, она проверяется (== расшифрована) открытым ключом и, если она найдена, продукт активируется.

Является ли это тривиальным или трудно взломать, я не уверен, что это действительно имеет большое значение.

Вероятность взлома вашего приложения намного более пропорциональна его полезности, а не силе обработки ключа продукта.

Лично я думаю, что есть два classа пользователей. Те, кто платит. Те, кто этого не делает. Те, кто это сделает, скорее всего, сделают это с помощью даже самой тривиальной защиты. Те, кто не будет ждать трещины или искать в другом месте. В любом случае, это не принесет вам больше денег.

Существует также возможность лицензирования и защиты программного обеспечения Microsoft (SLP). Прочитав об этом, я действительно хотел бы использовать его.

Мне очень нравится идея блокировки частей кода на основе лицензии. Горячий материал и наиболее безопасный для .NET. Интересное чтение, даже если вы его не используете!

Служба лицензирования и защиты программного обеспечения Microsoft® (SLP) – это услуга активации программного обеспечения, которая позволяет независимым поставщикам программного обеспечения (ISV) применять гибкие условия лицензирования для своих клиентов. Microsoft SLP Services использует уникальный метод защиты, который помогает защитить ваше приложение и информацию о лицензировании, позволяя вам быстрее выйти на рынок, одновременно повышая соблюдение требований клиентов.

Примечание. Это единственный способ выпуска продукта с чувствительным кодом (например, ценным алгоритмом).

Должен признаться, я сделал бы что-то вроде сумасшедшего.

  1. Найдите узкое место процессора и извлеките его в файл P / Invokeable DLL.
  2. В качестве действия post build зашифруйте часть DLL-файла с помощью ключа шифрования XOR.
  3. Выберите схему открытого / закрытого ключа, включите открытый ключ в DLL-файл
  4. Упорядочить так, чтобы дешифрование ключа продукта и XORing две половинки вместе привели ключ шифрования для DLL.
  5. В коде DLL DllMain отключите защиту (PAGE_EXECUTE_READWRITE) и расшифруйте ее с помощью ключа.
  6. Сделайте метод LicenseCheck (), который проведет проверку работоспособности ключа лицензии и параметров, а затем проверит весь файл DLL, бросив на него нарушение лицензии. О, и сделайте еще одну инициализацию здесь.

Когда они находят и удаляют LicenseCheck, что будет весело, когда DLL начнет сбой сегментации .

Если вы хотите простое решение для создания и проверки серийных номеров, попробуйте Ellipter . Он использует криптографию кривых эллиптических кривых и имеет функцию «Дата истечения срока действия», чтобы вы могли создавать пробные версии или временные ключи регистрации.

Еще одним хорошим недорогим инструментом для ключей и активаций продукта является продукт под названием InstallKey. Взгляните на http://www.lomacons.com

Хитрость заключается в том, чтобы иметь алгоритм, который вы только знаете (чтобы его можно было декодировать на другом конце).

Есть такие простые вещи, как «Выберите общее число и добавьте к нему магическое число»,

Более сложные варианты, такие как использование асимметричного шифрования набора двоичных данных (которые могут включать уникальный идентификатор, номера версий и т. Д.) И распространение зашифрованных данных в качестве ключа.

Возможно, стоит также прочитать ответы на этот вопрос

Для этого есть некоторые инструменты и API. Однако, я не думаю, что вы найдете его бесплатно;)

Например, набор OLicense: http://www.olicense.de/index.php?lang=en

Один простой метод – использовать глобально уникальный идентификатор (GUID). GUID обычно сохраняются как 128-битные значения и обычно отображаются как 32 шестнадцатеричных цифры с группами, разделенными дефисом, например {21EC2020-3AEA-4069-A2DD-08002B30309D} .

Используйте следующий код в C # с помощью System.Guid.NewGuid() .

 getKey = System.Guid.NewGuid().ToString().Substring(0, 8).ToUpper(); //Will generate a random 8 digit hexadecimal string. _key = Convert.ToString(Regex.Replace(getKey, ".{4}", "$0/")); // And use this to separate every four digits with a "/". 

Я надеюсь, что это помогает.

Вы можете проверить LicenseSpot . Это обеспечивает:

  • Бесплатный лицензионный компонент
  • Онлайн-активация
  • API для интеграции вашего приложения и интернет-магазина
  • Генерация серийного номера
  • Отменить лицензии
  • Управление подпиской

Я собираюсь немного подойти к замечательному ответу @ frankodwyer и углубиться в онлайн-лицензирование. Я являюсь основателем Keygen , лицензирующего REST API, созданного для разработчиков.

Поскольку вы упомянули о том, что вам нужны два типа «лицензий для вашего приложения», то есть «полная версия» и «пробная версия», мы можем упростить это и использовать модель лицензий функций, в которой вы лицензируете определенные функции вашего приложения (в этом случае, есть «полный» набор функций и «пробный» набор функций).

Для начала мы могли бы создать 2 типа лицензии (называемые политиками в Keygen), и всякий раз, когда пользователь регистрирует учетную запись, вы можете создать для нее пробную лицензию («пробная» лицензия реализует нашу «пробную» функциональную политику) , которые вы можете использовать для выполнения различных проверок в приложении, например, пользователь может использовать Trial-Feature-A и Trial-Feature-B .

И основываясь на этом, всякий раз, когда пользователь покупает ваше приложение (независимо от того, используете ли вы PayPal, Stripe и т. Д.), Вы можете создать лицензию, реализующую «полную» функциональную политику и связать ее с учетной записью пользователя. Теперь в вашем приложении вы можете проверить, имеет ли пользователь полную лицензию, которая может выполнять Pro-Feature-X и Pro-Feature-Y (делая что-то вроде user.HasLicenseFor(FEATURE_POLICY_ID) ).

Я упомянул, что позволяет пользователям создавать учетные записи пользователей – что я имею в виду? Я подробно рассмотрел это в нескольких других ответах , но быстро понял, почему я считаю, что это лучший способ аутентификации и идентификации ваших пользователей:

  1. Учетные записи пользователей позволяют связывать несколько лицензий и несколько компьютеров с одним пользователем , давая вам представление о поведении вашего клиента и предлагая им «покупки в приложении», то есть приобретая вашу «полную» версию (вроде мобильных приложений).
  2. Мы не должны требовать от наших клиентов ввода длинных лицензионных ключей, которые являются утомительными для ввода и трудно отслеживать, т.е. они легко теряются. (Попробуйте найти «потерянный лицензионный ключ» в Twitter!)
  3. Клиенты привыкли пользоваться электронной почтой / паролем ; Я думаю, мы должны делать то, что люди привыкли делать, чтобы мы могли обеспечить хороший пользовательский интерфейс (UX).

Конечно, если вы не хотите обрабатывать учетные записи пользователей и хотите, чтобы ваши пользователи вводили лицензионные ключи, это совершенно нормально (и Keygen также поддерживает это ). Я просто предлагаю другой способ справиться с этим аспектом лицензирования и, надеюсь, предоставить хороший UX для ваших клиентов.

Наконец, поскольку вы также упомянули, что хотите обновлять эти лицензии ежегодно, вы можете установить длительность ваших политик, чтобы «полные» лицензии истекали через год, а «пробные» лицензии – 2 недели, требуя, чтобы ваши пользователи приобрели новый лицензия после истечения срока действия.

Я мог бы копаться больше, вступая в ассоциирование машин с пользователями и тому подобное, но я думал, что постараюсь, чтобы этот ответ был коротким и сосредоточился на просто лицензировании функций для ваших пользователей.

Проверьте этот ответ: https://stackoverflow.com/a/38598174/1275924

Идея состоит в том, чтобы использовать Cryptolens в качестве сервера лицензий. Вот пошаговый пример (в C # и VB.NET). Я также добавил fragment кода для проверки ключа ниже (в C #):

 var licenseKey = "GEBNC-WZZJD-VJIHG-GCMVD"; var RSAPubKey = "{enter the RSA Public key here}"; var auth = "{access token with permission to access the activate method}"; var result = Key.Activate(token: auth, parameters: new ActivateModel() { Key = licenseKey, ProductId = 3349, Sign = true, MachineCode = Helpers.GetMachineCode() }); if (result == null || result.Result == ResultType.Error || !result.LicenseKey.HasValidSignature(RSAPubKey).IsValid()) { // an error occurred or the key is invalid or it cannot be activated // (eg. the limit of activated devices was achieved) Console.WriteLine("The license does not work."); } else { // everything went fine if we are here! Console.WriteLine("The license is valid!"); } Console.ReadLine(); 
  • Что происходит с тем, что происходит с памятью с памятью std :: deque?
  • g ++ неопределенная ссылка на typeinfo
  • Динамический массив в C #
  • Каков правильный способ использования C ++ 11?
  • Использование JsonConvert.DeserializeObject для десериализации Json в class C # POCO
  • C # - статические типы не могут использоваться как аргументы типа
  • лить class в другой class или преобразовать class в другой
  • Отправка файлов с использованием HTTP POST в c #
  • Измените web.config программно с помощью C # (.NET)
  • Пространство имен для
  • Как проверить ОС с помощью директивы препроцессора?
  • Interesting Posts

    Скрытие UITabBar при нажатии UIView

    Как вызвать bash, запустить команды внутри новой оболочки и затем вернуть управление пользователю?

    Как работает регулярное выражение ‘(? <= #) + (? = #)'?

    Обработка событий для iOS – как hitTest: withEvent: и pointInside: withEvent: связаны?

    Как переопределить параметр CopyLocal (Private) для ссылок в .NET из MSBUILD

    Объясните, почему .bash_logout не запускает команды?

    Выбор всех столбцов, начинающихся с XXX с помощью шаблона?

    Выполнить функцию оболочки с тайм-аутом

    Как использовать Json.NET для JSON-моделирования в проекте MVC5?

    XSD – как разрешить элементы в любом порядке сколько угодно раз?

    Запрос, основанный на нескольких предложениях в Firebase

    Есть ли способ программно прокрутить представление прокрутки к определенному тексту редактирования?

    Как отсортировать данные по дате

    Лучший способ получить путь к папке приложения

    getHeight возвращает 0 для всех объектов Android UI

    Давайте будем гением компьютера.