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:
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:
Odpowiedzi:
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. :-)
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:
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ć;)
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.
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.
Muszę przyznać, że zrobiłbym coś raczej szalonego.
Kiedy znajdą i usuną LicenseCheck, jaka zabawa nastąpi, gdy biblioteka DLL rozpocznie segmentację błędów .
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).
Innym dobrym, niedrogim narzędziem do kluczy produktów i aktywacji jest produkt o nazwie InstallKey. Zajrzyj na www.lomacons.com
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.
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
Jest do tego dostępnych kilka narzędzi i API. Jednak nie sądzę, że znajdziesz taki za darmo;)
Jest na przykład pakiet OLicense: http://www.olicense.de/index.php?lang=en
Możesz sprawdzić LicenseSpot . To zapewnia:
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:
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.
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();