Як я можу створити ключ продукту для моєї програми C #?
Мені потрібно створити ключ продукту (або ліцензії), який я щороку оновлюю. Додатково мені потрібно створити такий для пробних версій.
Пов’язані:
Як я можу створити ключ продукту для моєї програми C #?
Мені потрібно створити ключ продукту (або ліцензії), який я щороку оновлюю. Додатково мені потрібно створити такий для пробних версій.
Пов’язані:
Відповіді:
Ви можете зробити щось на зразок створення запису, який містить дані, які ви хочете автентифікувати в програмі. Сюди може входити все, що завгодно - наприклад, функції програми, які потрібно ввімкнути, термін дії, ім’я користувача (якщо ви хочете прив’язати його до користувача). Потім зашифруйте це, використовуючи якийсь крипто алгоритм із фіксованим ключем або хешуйте його. Тоді ви просто перевіряєте це у своїй програмі. Одним із способів розповсюдження файлу ліцензії (у Windows) є надання його у вигляді файлу, який оновлює реєстр (заощаджує користувач, який повинен його набирати).
Остерігайтеся помилкового почуття безпеки - рано чи пізно хтось просто виправить вашу програму, щоб пропустити цю перевірку, і розповсюдить виправлену версію. Або вони розробить ключ, який пройде всі перевірки, і розподілить його, або поставить дату на годинник і т. Д. Неважливо, наскільки заплутаним ви робите свою схему, все, що ви зробите для цього, врешті-решт буде захистом через неясність, і вони завжди будуть вміти це. Навіть якщо вони не можуть, хтось буде, і буде поширювати зламану версію. Те саме стосується навіть якщо ви постачаєте ключ - якщо хтось захоче, він може виправити чек і на це. Цифрове підписання коду не допоможе, вони можуть видалити цей підпис або подати у відставку.
Ви можете дещо ускладнити ситуацію, використовуючи прийоми для запобігання запуску програми в налагоджувачі тощо, але навіть це не є кульовим доказом. Тож вам слід просто ускладнити це, щоб чесний користувач не забув заплатити. Також будьте дуже обережні, щоб ваша схема не стала нав'язливою для користувачів, які платять - краще мати кілька зірваних копій, ніж для тих, хто платить клієнтам, щоб вони не могли використовувати те, за що вони заплатили.
Іншим варіантом є проведення онлайн-перевірки - достатньо надати користувачеві унікальний ідентифікатор та перевірити в Інтернеті, які можливості повинен мати цей ідентифікатор, та кешувати його протягом певного періоду. Однак застосовуються ті самі застереження - люди можуть обійти все, що завгодно.
Враховуйте також витрати на підтримку, пов’язані з необхідністю мати справу з користувачами, які забули свій ключ тощо.
редагувати: я просто хочу додати, не вкладайте в це занадто багато часу або не думайте, що якось ваша заплутана схема буде іншою і незламною. Це не буде, і не може бути, поки люди контролюють апаратне забезпечення та ОС, на якій працює ваша програма. Розробники намагаються придумати для цього все більш складні схеми, думаючи, що якщо вони розроблять власну систему для неї, тоді вона буде відома лише їм, а отже, "більш безпечною". Але насправді це еквівалент програмування спроби побудувати вічний рухомий апарат. :-)
Кому ви довіряєте?
Я завжди вважав цю область надто критичною, щоб довіряти третій стороні керувати безпекою виконання вашого додатка. Як тільки цей компонент зламається для одного додатка, він зламається для всіх програм. Це сталося з 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 # 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}", "$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 типи ліцензій (що називаються політиками в Keygen), і кожен раз, коли користувач реєструє обліковий запис, ви можете створити «пробну» ліцензію для їх запуску («пробна» ліцензія реалізує нашу «пробну» функціональну політику) , за допомогою якого можна виконувати різні перевірки в додатку, наприклад, чи може користувач використовувати Trial-Feature-A та Trial-Feature-B .
І спираючись на це, кожного разу, коли користувач купує ваш додаток (незалежно від того, чи використовуєте ви PayPal, Stripe тощо), ви можете створити ліцензію, що реалізує політику "повного" функціонування, і пов’язати її з обліковим записом користувача . Тепер у вашому додатку ви можете перевірити, чи має користувач "повну" ліцензію, яка може робити Pro-Feature-X та Pro-Feature-Y (виконавши щось подібне user.HasLicenseFor(FEATURE_POLICY_ID)
).
Я згадав про те, як дозволити вашим користувачам створювати облікові записи користувачів - що я маю на увазі під цим? Я детально розібрався в цьому в декількох інших відповідях , але короткий виклад того, чому, на мою думку, це найкращий спосіб автентифікації та ідентифікації ваших користувачів:
Звичайно, якщо ви не хочете обробляти облікові записи користувачів і хочете, щоб ваші користувачі вводили ліцензійні ключі, це цілком нормально (і Keygen це теж підтримує ). Я просто пропоную ще один спосіб обійти цей аспект ліцензування і, сподіваюся, забезпечити приємний інтерфейс для своїх клієнтів.
Нарешті, оскільки ви також згадали, що хочете щороку оновлювати ці ліцензії, ви можете встановити тривалість у своїх політиках, щоб "повні" ліцензії закінчилися через рік, а "пробні" ліцензії тривали, скажімо, 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();