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

StackOverflow https://stackoverflow.com/questions/453030

  •  19-08-2019
  •  | 
  •  

Вопрос

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

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

Похожие:

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Есть такой вариант Лицензирование и защита программного обеспечения Корпорации Майкрософт (SLP) Также услуги.Прочитав об этом, я действительно жалею, что не могу им воспользоваться.

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

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

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

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

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

Один простой метод заключается в использовании Глобально Уникальный Идентификатор (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 "/".

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

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

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

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

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

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

Существует, например, пакет OLicense suite:http://www.olicense.de/index.php?lang=en

Вы можете проверить Лицензионный ящик.Это обеспечивает:

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

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

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

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

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

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

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

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

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

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

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

Идея состоит в том, чтобы использовать Криптолинзы в качестве сервера лицензий.Вот такой пошаговый пример (на 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top