Jak mogę utworzyć klucz produktu dla mojej aplikacji C #?


91

Jak mogę utworzyć klucz produktu dla mojej aplikacji C #?

Muszę utworzyć klucz produktu (lub licencję), który aktualizuję co roku. Dodatkowo muszę utworzyć taki dla wersji próbnych.

Związane z:



@stukelly, który został opublikowany po tym, jak J3r3myK opublikował swoje pytanie ...
Dozer789

Odpowiedzi:


83

Możesz zrobić coś takiego, jak utworzenie rekordu zawierającego dane, które chcesz uwierzytelnić w aplikacji. Może to obejmować wszystko, co chcesz - np. Funkcje programu do włączenia, datę wygaśnięcia, nazwę użytkownika (jeśli chcesz powiązać go z użytkownikiem). Następnie zaszyfruj to za pomocą jakiegoś algorytmu kryptograficznego ze stałym kluczem lub zaszyfruj go. Następnie po prostu zweryfikuj to w swoim programie. Jednym ze sposobów dystrybucji pliku licencji (w systemie Windows) jest dostarczenie go jako pliku aktualizującego rejestr (dzięki czemu użytkownik nie musi go wpisywać).

Uważaj jednak na fałszywe poczucie bezpieczeństwa - prędzej czy później ktoś po prostu załatuje twój program, aby pominąć tę kontrolę i rozprowadzić poprawioną wersję. Albo opracują klucz, który przejdzie wszystkie kontrole i rozprowadzi go, albo postawi datę wsteczną na zegarze itp. Nie ma znaczenia, jak skomplikowany jest twój plan, wszystko, co w tym celu zrobisz, będzie ostatecznie zabezpieczeniem poprzez niejasność i zawsze będzie być w stanie to zrobić. Nawet jeśli nie mogą, ktoś to zrobi i rozpowszechni zhakowaną wersję. To samo dotyczy sytuacji, gdy dostarczysz klucz sprzętowy - jeśli ktoś chce, może również załatać czek. Cyfrowe podpisanie kodu nie pomoże, mogą usunąć ten podpis lub zrezygnować z niego.

Możesz trochę skomplikować sprawę, używając technik uniemożliwiających uruchomienie programu w debugerze itp., Ale nawet to nie jest kuloodporne. Powinieneś więc po prostu to utrudnić, aby uczciwy użytkownik nie zapomniał zapłacić. Uważaj również, aby Twój program nie stał się natrętny dla płacących użytkowników - lepiej mieć jakieś oszukane kopie, niż żeby płacący klienci nie mogli korzystać z tego, za co zapłacili.

Inną opcją jest sprawdzenie online - wystarczy podać użytkownikowi unikalny identyfikator i sprawdzić online, jakie możliwości powinien mieć ten identyfikator, i przechowywać go w pamięci podręcznej przez jakiś czas. Obowiązują jednak te same zastrzeżenia - ludzie mogą obejść coś takiego.

Weź również pod uwagę koszty obsługi związane z koniecznością radzenia sobie z użytkownikami, którzy zapomnieli klucza itp.

edytuj: Chcę tylko dodać, nie inwestuj w to zbyt wiele czasu lub myśl, że w jakiś sposób twój zawiły schemat będzie inny i nie do złamania. Nie będzie i nie może być tak długo, jak ludzie będą kontrolować sprzęt i system operacyjny, na którym działa twój program. Deweloperzy próbowali wymyślić coraz bardziej złożone schematy, myśląc, że jeśli opracują do tego własny system, będzie on znany tylko im, a zatem „bezpieczniejszy”. Ale tak naprawdę jest to programistyczny odpowiednik próby zbudowania perpetuum mobile. :-)


1
Dobre podsumowanie. Jeśli ktoś nie wierzy, że można to łatwo ominąć, wyszukaj CheatEngine, dzięki temu nieprogramiści mogą to zrobić. Najlepiej uczynić tę warstwę prostą.
Kelly

Mam ten sam problem, zrobiłem klucz licencyjny do mojej aplikacji z datą wygaśnięcia i ostatnią zarejestrowaną datą do weryfikacji, ale problem polega na tym, że muszę dodać klucz prywatny, aby edytować plik, aby zaktualizować ostatnią zalogowaną datę, która jest niezbyt mądry sposób na umieszczenie klucza w kodzie. jakakolwiek rada ?
Doicare

16

Komu ufasz?

Zawsze uważałem ten obszar za zbyt krytyczny, aby zaufać stronie trzeciej do zarządzania bezpieczeństwem aplikacji w czasie wykonywania. Gdy ten komponent zostanie złamany dla jednej aplikacji, zostanie złamany dla wszystkich aplikacji. Zdarzyło się to Discreet w pięć minut, gdy lata temu zaczęli korzystać z rozwiązania licencyjnego innej firmy dla 3ds Max ... Dobre czasy!

Poważnie, rozważ zmianę własnego, aby mieć pełną kontrolę nad algorytmem. Jeśli tak, rozważ użycie komponentów w swoim kluczu w następujący sposób:

  • Nazwa licencji - nazwa klienta (jeśli istnieje), na którą licencjonujesz. Przydatne do zarządzania wdrożeniami firmowymi - spraw, aby czuli się wyjątkowo, mając „spersonalizowaną” nazwę w informacjach licencyjnych, które im dostarczasz.
  • Data wygaśnięcia licencji
  • Liczba użytkowników do uruchomienia na tej samej licencji. Zakłada się, że masz sposób śledzenia uruchomionych wystąpień w witrynie w sposób serwerowy
  • Kody funkcji - aby umożliwić korzystanie z tego samego systemu licencjonowania w wielu funkcjach i wielu produktach. Oczywiście, jeśli jest pęknięty dla jednego produktu, jest pęknięty dla wszystkich.

Następnie sumuj z nich piekło i dodaj dowolne (odwracalne) szyfrowanie, które chcesz, aby trudniej było je złamać.

Aby utworzyć próbny klucz licencyjny, po prostu ustaw wartości dla powyższych wartości, które są tłumaczone jako „tryb próbny”.

A ponieważ jest to teraz prawdopodobnie najważniejszy kod w twojej aplikacji / firmie, zamiast zaciemniania danych rozważ umieszczenie procedur deszyfrujących w natywnym pliku DLL i po prostu P / Invoke do niego.

Kilka firm, dla których pracowałem, przyjęło uogólnione podejście z wielkim sukcesem. A może produktów nie warto było łamać;)


3
Szyfrowanie FYI jest zawsze odwracalne, byłoby bezużyteczne, gdyby nie było możliwości odczytania tego, co zostało zaszyfrowane. Haszowanie to jedyny sposób „szyfrowania”, o którym możesz pomyśleć.
Samuel

Najlepszym rozwiązaniem jest „Nie twórz własnego schematu kryptograficznego”, który, jak sądzę, pochodzi od Bruce'a Scheiera (nie jestem pewien). Możesz
rzucić

Czy możesz rozwinąć temat „..P / Invoke to it”. Spojrzałem na linkowaną stronę, ale nie uczyniło mnie to mądrzejszym: - /
MrCalvin

11

Jeśli pytasz o klucze, które możesz wpisać, na przykład klucze produktu Windows, są one oparte na niektórych sprawdzeniach. Jeśli mówisz o kluczach, które musisz skopiować wklej, to są one oparte na podpisie cyfrowym (szyfrowanie klucza prywatnego).

Prostą logiką klucza produktu może być rozpoczęcie od stwierdzenia, że ​​klucz produktu składa się z czterech 5-cyfrowych grup, na przykład abcde-fghij-kljmo-pqrst, a następnie określenie relacji wewnętrznych, takich jak f + k + p, powinno być równe a, co oznacza pierwsze cyfry 2 , 3 i 4 grupy powinny w sumie dać a. Oznacza to, że 8xxxx-2xxxx-4xxxx-2xxxx jest prawidłowy, podobnie jak 8xxxx-1xxxx-0xxxx-7xxxx. Oczywiście istniałyby również inne relacje, w tym złożone relacje, na przykład jeśli druga cyfra pierwszej grupy jest nieparzysta, to ostatnia cyfra ostatniej grupy również powinna być nieparzysta. W ten sposób istniałyby generatory kluczy produktów, a weryfikacja kluczy produktów po prostu sprawdzałaby, czy pasuje do wszystkich reguł.

Szyfrowanie to zwykle ciąg informacji o licencji zaszyfrowany przy użyciu klucza prywatnego (== podpisany cyfrowo) i przekonwertowany na Base64 . Klucz publiczny jest dystrybuowany wraz z aplikacją. Gdy nadejdzie ciąg Base64, zostanie zweryfikowany (== odszyfrowany) za pomocą klucza publicznego i jeśli zostanie uznany za ważny, produkt zostanie aktywowany.


9

Niezależnie od tego, czy jest to trywialne, czy trudne do złamania, nie jestem pewien, czy naprawdę ma to duże znaczenie.

Prawdopodobieństwo pęknięcia aplikacji jest znacznie bardziej proporcjonalne do jej użyteczności niż siły obsługi klucza produktu.

Osobiście uważam, że istnieją dwie klasy użytkowników. Ci, którzy płacą. Ci, którzy tego nie robią. Te, które to zrobią, zapewne zrobią to z nawet najbardziej trywialną ochroną. Ci, którzy tego nie robią, będą czekać na pęknięcie lub szukać gdzie indziej. Tak czy inaczej, nie przyniesie ci to więcej pieniędzy.


6

Muszę przyznać, że zrobiłbym coś raczej szalonego.

  1. Znajdź wąskie gardło procesora i wyodrębnij je do pliku DLL P / Invokeable .
  2. W ramach czynności po kompilacji zaszyfruj część pliku DLL za pomocą klucza szyfrowania XOR.
  3. Wybierz schemat klucza publicznego / prywatnego, dołącz klucz publiczny do pliku DLL
  4. Ułóż tak, aby odszyfrowanie klucza produktu i XORowanie obu połówek razem skutkowało otrzymaniem klucza szyfrowania dla biblioteki DLL.
  5. W kodzie DllMain biblioteki DLL wyłącz ochronę (PAGE_EXECUTE_READWRITE) i odszyfruj ją za pomocą klucza.
  6. Utwórz metodę LicenseCheck (), która sprawdza poprawność klucza licencyjnego i parametrów, a następnie sumuje kontrolne cały plik DLL, rzucając naruszenie licencji na jedną z nich. Aha, i wykonaj tutaj inną inicjalizację.

Kiedy znajdą i usuną LicenseCheck, jaka zabawa nastąpi, gdy biblioteka DLL rozpocznie segmentację błędów .


Czy nie wymagałoby to wyłączenia funkcji DEP?
Rowland Shaw

Nie. Ustawienie PAGE_EXECUTE_READWRITE jest udokumentowanym prawidłowym sposobem pisania samomodyfikującego się kodu i czyści bit NX tylko na tej stronie.
Joshua,

8
Ta ogólna technika była bardzo popularna w późnych latach 80-tych. Jego słabością było to, że „tajny” kod jest odszyfrowywany do pamięci RAM, co ułatwia kradzież z dowolnej działającej kopii oprogramowania.
Ray Burns,

5

Dostępna jest również opcja Usługi licencjonowania i ochrony oprogramowania (SLP) firmy Microsoft . Po przeczytaniu o tym naprawdę chciałbym móc go użyć.

Bardzo podoba mi się pomysł blokowania części kodu na podstawie licencji. Najpopularniejsze i najbezpieczniejsze dla .NET. Ciekawa lektura, nawet jeśli jej nie używasz!

Usługi licencjonowania i ochrony oprogramowania (SLP) firmy Microsoft® to usługa aktywacji oprogramowania, która umożliwia niezależnym dostawcom oprogramowania (ISV) przyjmowanie elastycznych warunków licencyjnych dla swoich klientów. Usługi Microsoft SLP wykorzystują unikalną metodę ochrony, która pomaga chronić aplikacje i informacje licencyjne, umożliwiając szybsze wejście na rynek przy jednoczesnym zwiększeniu zgodności z wymaganiami klientów.

Uwaga: to jedyny sposób, w jaki mógłbym wydać produkt z wrażliwym kodem (takim jak cenny algorytm).


Dla tych, którzy pamiętają to jako odwołane: SLP zostaje ponownie uruchomiony
Michael Olesen

5

Jeśli potrzebujesz prostego rozwiązania do tworzenia i weryfikowania numerów seryjnych, wypróbuj Ellipter . Wykorzystuje kryptografię krzywych eliptycznych i ma funkcję „Data wygaśnięcia”, dzięki czemu można tworzyć wersje próbne lub ograniczone czasowo klucze rejestracyjne.


2

Innym dobrym, niedrogim narzędziem do kluczy produktów i aktywacji jest produkt o nazwie InstallKey. Zajrzyj na www.lomacons.com


2

Jedną z prostych metod jest użycie unikatowego identyfikatora globalnego (GUID). Identyfikatory GUID są zwykle przechowywane jako wartości 128-bitowe i są zwykle wyświetlane jako 32 cyfry szesnastkowe z grupami oddzielonymi myślnikami, takimi jak {21EC2020-3AEA-4069-A2DD-08002B30309D}.

Użyj następującego kodu C # w języku 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 "/".

Mam nadzieję, że to pomoże.


1

Sztuczka polega na tym, aby mieć algorytm, który znasz tylko Ty (taki, że można go zdekodować na drugim końcu).

Są takie proste rzeczy, jak „Wybierz liczbę pierwszą i dodaj do niej magiczną liczbę”

Bardziej zawiłe opcje, takie jak użycie asymetrycznego szyfrowania zestawu danych binarnych (które mogą zawierać unikalny identyfikator, numery wersji itp.) I rozpowszechnianie zaszyfrowanych danych jako klucza.

Może również być warta przeczytania odpowiedzi na to pytanie , a także


6
„Sztuczka polega na tym, aby mieć algorytm, który znasz tylko Ty” - to w zasadzie definicja bezpieczeństwa przez zaciemnienie i naprawdę zły pomysł.
Nick Johnson

3
Wszystkie licencje są jednak oparte na algorytmie obejmującym tajemnice. Licencjonowanie jest często najlepszym rozwiązaniem, jeśli chodzi o inwestowanie w prawników, a nie wyścig zbrojeń polegający na wymyślaniu „niezniszczalnych” kluczy
Rowland Shaw,

+1 za komentarz dotyczący egzekwowania licencji za pomocą środków prawnych
Rob

Tak, wszystkie licencje są słabe, podobnie jak DRM. Poleganie na tajnym algorytmie jest jednak wyraźnie słabsze .
Nick Johnson,

1
Dałem ci +1 za dobrą odpowiedź i chciałbym dać ci jeszcze jedną przeciw głosowaniu przeciw. Niestety na świecie jest kilka bardzo niedojrzałych małych dzieci.
ProfK,


0

Możesz sprawdzić LicenseSpot . To zapewnia:

  • Darmowy składnik licencjonowania
  • Aktywacja online
  • API do integracji Twojej aplikacji i sklepu internetowego
  • Generowanie numeru seryjnego
  • Odwołaj licencje
  • Zarządzanie subskrypcjami

1
„Bezpłatne” nie jest tak naprawdę bezpłatne. Osadzenie komponentu licencyjnego w aplikacji jest bezpłatne; faktyczne korzystanie z komponentu licencyjnego przez aplikację nie jest darmowe . Powyżej 10 aktywacji należy uiścić miesięczną opłatę. Nie jest to wartość procentowa na aktywację. W przypadku niskobudżetowych i tanich aplikacji .NET ten model cenowy będzie wadą. Nie przypomina Apple AppStore dla aplikacji .NET.
Cheeso

0

Zamierzam trochę wycofać się ze świetnej odpowiedzi @ frankodwyera i zagłębić się w licencjonowanie online. Jestem założycielem Keygen , licencjonującego API REST zbudowanego dla programistów.

Ponieważ wspomniałeś o potrzebie 2 „typów” licencji dla swojej aplikacji, tj. „Pełnej wersji” i „wersji próbnej”, możemy to uprościć i użyć modelu licencji na funkcje, w którym licencjonujesz określone funkcje aplikacji (w tym przypadku istnieje „pełny” zestaw funkcji i zestaw funkcji „próbnych”).

Na początek moglibyśmy utworzyć 2 typy licencji (zwane politykami w Keygen) i za każdym razem, gdy użytkownik rejestruje konto, można wygenerować licencję „próbną”, która umożliwi mu rozpoczęcie (licencja „próbna” implementuje nasze zasady dotyczące funkcji „wersji próbnej”) , których można użyć do przeprowadzenia różnych kontroli w aplikacji, np. użytkownik może użyć wersji Trial-Feature-A i Trial-Feature-B .

Opierając się na tym, za każdym razem, gdy użytkownik kupi Twoją aplikację (niezależnie od tego, czy korzystasz z PayPal, Stripe itp.), Możesz wygenerować licencję wdrażającą zasady „pełnej” funkcji i powiązać ją z kontem użytkownika . Teraz w swojej aplikacji możesz sprawdzić, czy użytkownik ma „pełną” licencję, która może robić Pro-Feature-X i Pro-Feature-Y (robiąc coś podobnego user.HasLicenseFor(FEATURE_POLICY_ID)).

Wspomniałem o umożliwieniu użytkownikom tworzenia kont użytkowników - co mam przez to na myśli? Omówiłem to szczegółowo w kilku innych odpowiedziach , ale krótkie podsumowanie, dlaczego uważam, że jest to lepszy sposób uwierzytelniania i identyfikacji użytkowników:

  1. Konta użytkowników umożliwiają powiązanie wielu licencji i wielu komputerów z jednym użytkownikiem , dając wgląd w zachowanie klientów i zachęcając ich do „zakupów w aplikacji” czyli zakupu „pełnej” wersji (coś w rodzaju aplikacji mobilnych).
  2. Nie powinniśmy wymagać od naszych klientów wprowadzania długich kluczy licencyjnych, które są zarówno żmudne, jak i trudne do śledzenia tj. Łatwo się gubią. (Spróbuj wyszukać „utracony klucz licencyjny” na Twitterze!)
  3. Klienci są przyzwyczajeni do używania adresu e-mail / hasła ; Myślę, że powinniśmy robić to, do czego ludzie są przyzwyczajeni, abyśmy mogli zapewnić dobre wrażenia użytkownika (UX).

Oczywiście, jeśli nie chcesz obsługiwać kont użytkowników i chcesz, aby użytkownicy wprowadzali klucze licencyjne, jest to całkowicie w porządku (a Keygen również to obsługuje ). Oferuję tylko inny sposób radzenia sobie z tym aspektem licencjonowania i mam nadzieję, że zapewnię przyjemny UX Twoim klientom.

Na koniec, ponieważ wspomniałeś również, że chcesz aktualizować te licencje co roku, możesz ustawić okres obowiązywania swoich zasad, tak aby „pełne” licencje wygasały po roku, a licencje „próbne” były ważne, powiedzmy 2 tygodnie, wymagając od użytkowników zakupu nowego licencja po wygaśnięciu.

Mógłbym bardziej zagłębić się w kojarzenie maszyn z użytkownikami i tego typu rzeczy, ale pomyślałem, że postaram się, aby ta odpowiedź była krótka i skupiła się na licencjonowaniu funkcji dla użytkowników.


0

Sprawdź tę odpowiedź: https://stackoverflow.com/a/38598174/1275924

Chodzi o to, aby użyć Cryptolens jako serwera licencji. Oto przykład krok po kroku (w C # i VB.NET). Załączam również fragment kodu do weryfikacji klucza poniżej (w 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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.