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


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

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

по теме:

14 82

14 ответов:

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

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

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

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

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

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

кому ты доверяешь?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

когда они найдут и удалят LicenseCheck, какое удовольствие последует когда DLL запускается сегментация ошибка.

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

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

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

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

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

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

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

есть, например, olicense suite: http://www.olicense.de/index.php?lang=en

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

используйте следующий код в C# by 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}", "/")); // And use this to separate every four digits with a "/".

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

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

  • Бесплатный Компонент Лицензирования
  • Онлайн Активации!--6-->
  • API для интеграции вашего приложения и онлайн-магазине
  • серийный номер
  • аннулировать лицензии
  • Управление Подпиской

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

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

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

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

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

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

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

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

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

пожалуйста, проверьте этот ответ: https://stackoverflow.com/a/38598174/1275924

идея заключается в использовании Cryptolens как сервер лицензий. Вот это пошаговый пример (В C# и VB.NET). я также прикрепил фрагмент кода для проверки ключа ниже (в 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();