Как я могу создать ключ продукта для своего приложения C #?
Мне нужно создать ключ продукта (или лицензии), который я обновляю ежегодно. Кроме того, мне нужно создать пробную версию.
Связанный:
Как я могу создать ключ продукта для своего приложения C #?
Мне нужно создать ключ продукта (или лицензии), который я обновляю ежегодно. Кроме того, мне нужно создать пробную версию.
Связанный:
Ответы:
Вы можете сделать что-то вроде создания записи, содержащей данные, которые вы хотите аутентифицировать в приложении. Это может включать все, что вы хотите - например, функции программы, которые нужно включить, дату истечения срока действия, имя пользователя (если вы хотите привязать его к пользователю). Затем зашифруйте это с помощью некоторого криптоалгоритма с фиксированным ключом или хешируйте. Затем вы просто проверяете это в своей программе. Один из способов распространения файла лицензии (в Windows) - предоставить его в виде файла, который обновляет реестр (избавляет пользователя от необходимости вводить его).
Остерегайтесь ложного чувства безопасности - рано или поздно кто-то просто исправит вашу программу, чтобы пропустить эту проверку, и распространит исправленную версию. Или они разработают ключ, который проходит все проверки и распространяет его, или отсчитывают время задним числом и т.д. уметь это. Даже если они не могут, кто-то будет распространять и распространять взломанную версию. То же самое применимо, даже если вы поставляете ключ - если кто-то хочет, они могут исправить проверку и для этого. Цифровая подпись вашего кода не поможет, они могут удалить эту подпись или отказаться от нее.
Вы можете немного усложнить ситуацию, используя методы, предотвращающие запуск программы в отладчике и т. Д., Но даже это не является пуленепробиваемым. Так что вам нужно просто усложнить задачу, чтобы честный пользователь не забыл заплатить. Также будьте очень осторожны, чтобы ваша схема не стала навязчивой для платящих пользователей - лучше иметь несколько оторванных копий, чем платящие клиенты не смогут использовать то, за что они заплатили.
Другой вариант - провести онлайн-проверку - просто предоставьте пользователю уникальный идентификатор и проверьте онлайн, какие возможности должен иметь этот идентификатор, и кешируйте его на некоторое время. Однако действуют те же предостережения - люди могут обойти все подобное.
Учитывайте также расходы на поддержку, связанные с необходимостью иметь дело с пользователями, которые забыли свой ключ и т. Д.
edit: Я просто хочу добавить, не тратьте на это слишком много времени и не думайте, что каким-то образом ваша запутанная схема будет отличаться и не поддается взлому. Этого не будет и не может быть, пока люди контролируют оборудование и ОС, на которых работает ваша программа. Разработчики пытались придумать для этого все более сложные схемы, думая, что если они разработают для этого свою собственную систему, то она будет известна только им и, следовательно, «более безопасна». Но на самом деле это программный эквивалент попытки построить вечный двигатель. :-)
Кому вы доверяете?
Я всегда считал эту область слишком важной, чтобы доверять третьей стороне управление безопасностью выполнения вашего приложения. Как только этот компонент взломан для одного приложения, он будет взломан для всех приложений. Это случилось с Discreet за пять минут, когда они использовали стороннее лицензионное решение для 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, она проверяется (== расшифровывается) с помощью открытого ключа, и, если он признан действительным, продукт активируется.
Тривиально это или сложно взломать, я не уверен, что это действительно имеет значение.
Вероятность того, что ваше приложение будет взломано, гораздо больше пропорциональна его полезности, а не силе обработки ключа продукта.
Лично я считаю, что есть два класса пользователей. Те, кто платит. Те, кто этого не делает. Те, которые это сделают, вероятно, сделают это даже с самой тривиальной защитой. Те, кто этого не делает, будут ждать трещины или искать в другом месте. В любом случае, это не принесет вам больше денег.
Я должен признать, что сделал бы что-нибудь довольно безумное.
Когда они найдут и удалят LicenseCheck, какое веселье будет после того, как DLL начнет нарушать сегментацию .
Также существует опция служб лицензирования и защиты программного обеспечения Microsoft (SLP). Прочитав об этом, я действительно хотел бы использовать его.
Мне очень нравится идея блокировки частей кода на основе лицензии. Горячий и самый безопасный для .NET. Интересно читать, даже если вы им не пользуетесь!
Службы лицензирования и защиты программного обеспечения Microsoft® (SLP) - это служба активации программного обеспечения, которая позволяет независимым поставщикам программного обеспечения (ISV) принимать гибкие условия лицензирования для своих клиентов. В службах Microsoft 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: http://www.olicense.de/index.php?lang=en
Вы можете проверить LicenseSpot . Это обеспечивает:
Я собираюсь немного воспользоваться отличным ответом @frankodwyer и немного углубиться в онлайн-лицензирование. Я основатель Keygen , лицензионного REST API, созданного для разработчиков.
Поскольку вы упомянули, что вам нужны 2 «типа» лицензий для вашего приложения, то есть «полная версия» и «пробная версия», мы можем упростить это и использовать модель лицензии на функции, в которой вы лицензируете определенные функции своего приложения (в данном случае есть «полный» набор функций и «пробный» набор функций).
Для начала мы могли бы создать 2 типа лицензий (называемых политиками в Keygen), и всякий раз, когда пользователь регистрирует учетную запись, вы можете сгенерировать для него «пробную» лицензию («пробная» лицензия реализует нашу политику «пробной» функции) , который вы можете использовать для выполнения различных проверок в приложении, например, может ли пользователь использовать Trial-Feature-A и Trial-Feature-B .
И, основываясь на этом, всякий раз, когда пользователь покупает ваше приложение (независимо от того, используете ли вы PayPal, Stripe и т. Д.), Вы можете создать лицензию, реализующую «полную» политику функций, и связать ее с учетной записью пользователя . Теперь в своем приложении вы можете проверить, есть ли у пользователя «полная» лицензия, которая может выполнять Pro-Feature-X и Pro-Feature-Y (выполнив что-то вродеuser.HasLicenseFor(FEATURE_POLICY_ID)
).
Я уже упоминал о разрешении вашим пользователям создавать учетные записи - что я имею в виду? Я подробно рассмотрел это в нескольких других ответах , но краткое изложение того, почему я считаю, что это лучший способ аутентификации и идентификации ваших пользователей:
Конечно, если вы не хотите обрабатывать учетные записи пользователей и хотите, чтобы пользователи вводили лицензионные ключи, это совершенно нормально (и 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();