Как я могу создать ключ продукта для моего приложения C #? - PullRequest
87 голосов
/ 17 января 2009

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

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

Похожие:

Ответы [ 14 ]

80 голосов
/ 17 января 2009

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

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

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

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

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

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

15 голосов
/ 17 января 2009

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

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

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

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

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

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

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

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

11 голосов
/ 18 января 2009

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

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

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

9 голосов
/ 17 января 2009

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

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

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

6 голосов
/ 18 января 2009

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

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

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

5 голосов
/ 12 декабря 2009

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

5 голосов
/ 18 января 2009

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

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

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

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

2 голосов
/ 04 июня 2014

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

Надеюсь, это поможет.

2 голосов
/ 19 марта 2010

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

1 голос
/ 17 января 2009

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

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

...