Як я можу створити ключ продукту для моєї програми C #?


90

Як я можу створити ключ продукту для моєї програми C #?

Мені потрібно створити ключ продукту (або ліцензії), який я щороку оновлюю. Додатково мені потрібно створити такий для пробних версій.

Пов’язані:



@stukelly, який був опублікований після того, як J3r3myK розмістив своє запитання ...
Dozer789

Відповіді:


83

Ви можете зробити щось на зразок створення запису, який містить дані, які ви хочете автентифікувати в програмі. Сюди може входити все, що завгодно - наприклад, функції програми, які потрібно ввімкнути, термін дії, ім’я користувача (якщо ви хочете прив’язати його до користувача). Потім зашифруйте це, використовуючи якийсь крипто алгоритм із фіксованим ключем або хешуйте його. Тоді ви просто перевіряєте це у своїй програмі. Одним із способів розповсюдження файлу ліцензії (у Windows) є надання його у вигляді файлу, який оновлює реєстр (заощаджує користувач, який повинен його набирати).

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

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

Іншим варіантом є проведення онлайн-перевірки - достатньо надати користувачеві унікальний ідентифікатор та перевірити в Інтернеті, які можливості повинен мати цей ідентифікатор, та кешувати його протягом певного періоду. Однак застосовуються ті самі застереження - люди можуть обійти все, що завгодно.

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

редагувати: я просто хочу додати, не вкладайте в це занадто багато часу або не думайте, що якось ваша заплутана схема буде іншою і незламною. Це не буде, і не може бути, поки люди контролюють апаратне забезпечення та ОС, на якій працює ваша програма. Розробники намагаються придумати для цього все більш складні схеми, думаючи, що якщо вони розроблять власну систему для неї, тоді вона буде відома лише їм, а отже, "більш безпечною". Але насправді це еквівалент програмування спроби побудувати вічний рухомий апарат. :-)


1
Хороший підсумок. Якщо хтось не вірить, що це просто обійти пошук CheatEngine, це робить настільки просто, що непрограмісти можуть це зробити. Найкраще зробити цей шар простим.
Келлі

У мене така сама проблема, я створив ліцензійний ключ для свого додатка із датою закінчення терміну дії та останньою датою, що реєструється для перевірки, але проблема полягає в тому, що я повинен додати закритий ключ для редагування файлу, щоб оновити дату останнього зареєстрованого не розумний спосіб ввести ключ у код. будь-яка порада?
Doicare

16

Кому ви довіряєте?

Я завжди вважав цю область надто критичною, щоб довіряти третій стороні керувати безпекою виконання вашого додатка. Як тільки цей компонент зламається для одного додатка, він зламається для всіх програм. Це сталося з Discreet за п’ять хвилин, як тільки вони пішли зі стороннім ліцензійним рішенням на 3ds Max років тому ... Гарні часи!

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

  • Ім'я ліцензії - ім’я клієнта (якщо є), якого ви ліцензуєте. Корисно для управління розгортанням компаній - змусьте їх почуватись особливими, маючи "персоналізоване" ім'я в інформації про ліцензію, яку ви їм надаєте.
  • Дата закінчення терміну дії ліцензії
  • Кількість користувачів, які працюють за однією ліцензією. Це передбачає, що у вас є спосіб відстеження запущених екземплярів на веб-сайті серверним способом
  • Коди функцій - щоб ви могли використовувати одну і ту ж систему ліцензування для багатьох функцій та для кількох продуктів. Звичайно, якщо воно розтріскується для одного товару, воно розтріскується для всіх.

Потім перевірте їх і додайте до них будь-яке (зворотне) шифрування, щоб ускладнити злом.

Щоб зробити пробний ліцензійний ключ, просто встановіть значення для вищезазначених значень, що перекладається як "пробний режим".

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

Кілька компаній, в яких я працював, із великим успіхом застосували узагальнені підходи до цього. А може, продукти не варті розтріскування;)


3
Шифрування FYI завжди є оборотним, марним було б неможливість прочитати зашифроване. Хешування - це єдиний спосіб "шифрування", про який ви можете подумати.
Самуель

"Не використовуйте власну крипто-схему", яку, на мою думку, від Брюса Шаєра (не впевнений) - це шлях. Можливо, ви захочете поглянути на цю відповідь: security.stackexchange.com/questions/2202/…
Шадок,

Чи можете Ви детальніше розказати про "..P / Закликати до цього". Я подивився сторінку, на яку це посилання, але це не зробило мене розумнішим: - /
MrCalvin

11

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

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

Зазвичай шифрування - це рядок інформації про ліцензію, зашифровану за допомогою приватного ключа (== цифровим підписом) і перетворену в Base64 . Відкритий ключ поширюється разом із додатком. Коли рядок Base64 надходить, він перевіряється (== розшифровується) відкритим ключем, і якщо його визнають дійсним, продукт активується.


8

Незалежно від того, чи це дріб’язково, чи важко його зламати, я не впевнений, що насправді це істотно впливає.

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

Особисто я думаю, що існує два класи користувачів. Ті, хто платить. Ті, хто цього не робить. Ті, хто це зробить, скоріше за все, матимуть навіть самий тривіальний захист. Ті, хто цього не зробить, будуть чекати тріщини або шукати в іншому місці. У будь-якому випадку, це більше не принесе вам грошей.


6

Треба визнати, я зробив би щось досить божевільне.

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

Коли вони знайдуть і видаляють LicenseCheck, яке задоволення настане, коли DLL почне неправильну сегментацію .


Тоді не потрібно, щоб DEP був відключений?
Роуленд Шоу

Ні. Налаштування PAGE_EXECUTE_READWRITE - це задокументований правильний спосіб писати самомодифікуючий код і очищає біт NX лише на цій сторінці.
Джошуа

8
Ця загальна техніка була дуже популярна наприкінці 80-х. Його слабкою стороною було те, що "секретний" код розшифровується в оперативній пам'яті, що дозволяє легко красти будь-яку запущену копію програмного забезпечення.
Рей Бернс,

5

Існує також опція Послуги ліцензування та захисту програмного забезпечення Microsoft (SLP). Прочитавши про це, я дуже хотів би цим скористатися.

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

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

Примітка: Це єдиний спосіб випустити продукт із чутливим кодом (наприклад, цінний алгоритм).


Для тих, хто пам’ятає його як скасований: SLP знову перезапущений
Michael Olesen

5

Якщо ви хочете просте рішення просто створити та перевірити серійні номери, спробуйте Ellipter . Він використовує криптографічні криві еліптичні криві та має функцію "Дата закінчення терміну дії", щоб ви могли створювати пробні версії або обмежені за часом реєстраційні ключі.


2

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


2

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

Сподіваюся, це допоможе.


1

Фокус у тому, щоб мати алгоритм, який ви знаєте лише ви (такий, щоб його можна було декодувати на іншому кінці).

Є такі прості речі, як "Виберіть просте число і додайте до нього магічне число"

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

Може бути варто прочитати відповіді на це питання , а також


6
"Фокус у тому, щоб мати алгоритм, який знаєте лише ви" - це майже таке визначення безпеки, як неясність, і дуже погана ідея.
Нік Джонсон

3
Все ліцензування відбувається за алгоритмом, що включає секрети. До ліцензування часто найкраще підходити, інвестуючи в адвокатів, а не гонку озброєнь, щоб придумати "незламні" ключі
Роуленд Шоу

+1 за коментар щодо правозастосування ліцензії законними засобами
Роб

Так, все ліцензування є слабким, як і DRM. Покладання на секретний алгоритм , однак, очевидно слабше .
Нік Джонсон

1
Я дав вам +1 за хорошу відповідь, і бажаю, щоб я дав вам ще один занадто протилежний голос проти. На жаль, у світі є дуже незрілі маленькі діти.
ProfK


0

Ви можете перевірити LicenseSpot . Він забезпечує:

  • Безкоштовний компонент ліцензування
  • Інтернет-активація
  • API для інтеграції вашого додатка та інтернет-магазину
  • Створення серійного номера
  • Відкликати ліцензії
  • Управління передплатою

1
"Безкоштовно" насправді не безкоштовно. Вбудувати компонент ліцензування у свій додаток можна безкоштовно; програма не може фактично використовувати компонент ліцензування. Понад 10 активацій Вам потрібно платити щомісячну плату. Це не відсоток активації. Для низькооб’ємних недорогих програм .NET ця модель ціноутворення буде недоліком. Це не схоже на Apple AppStore для програм .NET.
Cheeso

0

Я трохи зупинюся на чудовій відповіді @ 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)).

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

  1. Облікові записи користувачів дозволяють асоціювати декілька ліцензій та декілька машин з одним користувачем , даючи вам уявлення про поведінку вашого клієнта та пропонувати їм "покупки в додатку", тобто придбання вашої "повної" версії (типу мобільних додатків).
  2. Ми не повинні вимагати від наших клієнтів введення довгих ліцензійних ключів, які втомлюють і вводити важко, тобто вони легко заблукають. (Спробуйте шукати "загублений ліцензійний ключ" у Twitter!)
  3. Клієнти звикли використовувати електронну пошту / пароль ; Я думаю, що ми повинні робити те, що люди звикли робити, щоб ми могли забезпечити хороший досвід користування (UX).

Звичайно, якщо ви не хочете обробляти облікові записи користувачів і хочете, щоб ваші користувачі вводили ліцензійні ключі, це цілком нормально (і Keygen це теж підтримує ). Я просто пропоную ще один спосіб обійти цей аспект ліцензування і, сподіваюся, забезпечити приємний інтерфейс для своїх клієнтів.

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

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


0

Перевірте цю відповідь: 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.