Jak wygenerować i zweryfikować klucz licencyjny oprogramowania?


236

Obecnie jestem zaangażowany w opracowywanie produktu (opracowanego w języku C #), który będzie dostępny do pobrania i zainstalowania za darmo, ale w bardzo ograniczonej wersji. Aby uzyskać dostęp do wszystkich funkcji, użytkownik musi uiścić opłatę licencyjną i otrzymać klucz. Ten klucz zostanie następnie wprowadzony do aplikacji w celu „odblokowania” pełnej wersji.

Ponieważ używanie takiego klucza licencyjnego jest czymś zwyczajnym, zastanawiam się:

  1. Jak to zwykle rozwiązuje się?
  2. Jak mogę wygenerować klucz i jak można go zweryfikować w aplikacji?
  3. Jak mogę również uniknąć publikowania klucza w Internecie i używania go przez osoby, które nie zapłaciły licencji (klucz, który w zasadzie nie jest „ich”).

Myślę, że powinienem jakoś powiązać klucz z wersją aplikacji, aby można było pobierać opłaty za nowe klucze w wersjach funkcji.

Czy jest jeszcze coś, o czym powinienem pomyśleć w tym scenariuszu?

Odpowiedzi:


126

Zastrzeżenie: nie możesz uniemożliwić użytkownikom piractwa, ale tylko ułatwisz uczciwym użytkownikom robienie właściwych rzeczy.

Zakładając, że nie chcesz tworzyć specjalnej kompilacji dla każdego użytkownika, to:

  • Wygeneruj sobie tajny klucz do produktu
  • Weź nazwę użytkownika
  • Połącz nazwę użytkownika oraz tajny klucz i skrót z (na przykład) SHA1
  • Rozpakuj skrót SHA1 jako ciąg alfanumeryczny. To jest „klucz produktu” indywidualnego użytkownika
  • W ramach programu wykonaj ten sam skrót i porównaj z kluczem produktu. Jeśli jest równy, OK.

Ale powtarzam: to nie zapobiegnie piractwu


Niedawno przeczytałem, że takie podejście nie jest bardzo kryptograficznie uzasadnione. Ale to rozwiązanie jest już słabe ( ponieważ samo oprogramowanie musi zawierać gdzieś tajny klucz ), więc nie sądzę, że to odkrycie unieważnia rozwiązanie w takim zakresie, w jakim się posuwa.

Pomyślałem, że naprawdę powinienem o tym wspomnieć; jeśli planujesz czerpać z tego coś innego, strzeż się.


13
jeśli program zawiera tajny klucz (jak sugerują powyższe kroki), złamanie go jest banalne
Steven A. Lowe

2
zredagowane, aby były bardziej oczywiste; nie może przecenić czegoś tak fundamentalnego ;-)
Steven A. Lowe,

23
Użyj asymetrycznej metody kryptograficznej (takiej jak RSA) do generowania i dekodowania klucza produktu, aby uniknąć osadzenia sekretu w kodzie.
Amir Moghimi,

6
Wydaje mi się, że zanim ktoś włamie się do twojego kodu (być może na poziomie asemblera) w celu znalezienia twojego tajnego klucza, prawdopodobnie znajduje się na poziomie, który może całkowicie ominąć twoje czeki. Nie sądzę, aby istniała tak bezpieczna metoda rejestracji, aby mogła przetrwać dobrego hakera uruchamiającego program lokalnie. Jak powiedział oryginalny komentarz, tak naprawdę chodzi o wszystko, co czyni go o jeden krok trudniejszym niż zwykłe kopiowanie pliku. Wiele gier w dzisiejszych czasach rezygnuje z ochrony przed kopiowaniem i po prostu przenosi zawartość gry online, w którym to przypadku kod jest poza zasięgiem hakera.
JamieB,

1
Czy często dołącza się ograniczenia do klucza licencyjnego? Na przykład ograniczenia czasowe, liczba jednoczesnych użytkowników, moduły do ​​zainstalowania itp.?
Carlo,

97

Istnieje wiele sposobów generowania kluczy licencyjnych, ale bardzo niewiele z nich jest naprawdę bezpiecznych. Szkoda, bo dla firm klucze licencyjne mają prawie taką samą wartość jak prawdziwa gotówka.

Idealnie byłoby, gdyby klucze licencyjne miały następujące właściwości:

  1. Tylko twoja firma powinna być w stanie generować klucze licencyjne dla twoich produktów, nawet jeśli ktoś całkowicie dokona inżynierii twoich produktów (co się stanie, mówię z doświadczenia). Ukrywanie algorytmu lub ukrywanie klucza szyfrowania w oprogramowaniu naprawdę nie wchodzi w rachubę, jeśli poważnie myślisz o kontrolowaniu licencjonowania. Jeśli twój produkt odniesie sukces, ktoś stworzy generator kluczy w ciągu kilku dni od wydania.

  2. Klucz licencyjny powinien być użyteczny tylko na jednym komputerze (a przynajmniej powinieneś być w stanie bardzo ściśle kontrolować)

  3. Klucz licencyjny powinien być krótki i łatwy do wpisania lub dyktowania przez telefon. Nie chcesz, aby każdy klient dzwonił do pomocy technicznej, ponieważ nie rozumie, czy klucz zawiera literę „l” czy „1”. Twój dział wsparcia podziękowałby Ci za to, a Ty poniesiesz niższe koszty w tym obszarze.

Jak więc rozwiązać te wyzwania?

  1. Odpowiedź jest prosta, ale trudna technicznie: podpisy cyfrowe z wykorzystaniem kryptografii klucza publicznego. Twoje klucze licencyjne powinny być w rzeczywistości podpisanymi „dokumentami”, zawierającymi przydatne dane, podpisanymi kluczem prywatnym firmy. Podpisy powinny być częścią klucza licencyjnego. Produkt powinien zweryfikować klucze licencyjne odpowiednim kluczem publicznym. W ten sposób nawet jeśli ktoś ma pełny dostęp do logiki produktu, nie może wygenerować kluczy licencyjnych, ponieważ nie ma klucza prywatnego. Klucz licencyjny wyglądałby tak: BASE32 (CONCAT (DANE, PRIVATE_KEY_ENCRYPTED (HASH (DANE)))) Największym wyzwaniem jest tutaj to, że klasyczne algorytmy klucza publicznego mają duże rozmiary sygnatur. RSA512 ma 1024-bitową sygnaturę. Nie chcesz, aby klucze licencyjne miały setki znaków. Jednym z najbardziej skutecznych podejść jest zastosowanie kryptografii krzywej eliptycznej (z ostrożnymi implementacjami, aby uniknąć istniejących patentów). Klucze ECC są 6 razy krótsze niż klucze RSA, dla tej samej siły. Możesz dodatkowo zmniejszyć rozmiary podpisów za pomocą algorytmów takich jak algorytm podpisu cyfrowego Schnorr (patent wygasł w 2008 roku - dobrze :))

  2. Można to osiągnąć przez aktywację produktu (dobrym przykładem jest Windows). Zasadniczo dla klienta z ważnym kluczem licencyjnym musisz wygenerować „dane aktywacyjne”, które są podpisanym komunikatem zawierającym identyfikator sprzętu komputera jako podpisane dane. Zwykle odbywa się to przez Internet, ale tylko RAZ: produkt wysyła klucz licencyjny i identyfikator sprzętu komputerowego do serwera aktywacyjnego, a serwer aktywacyjny odsyła podpisaną wiadomość (która może być również krótka i łatwa do dyktowania telefon). Od tego momentu produkt nie sprawdza klucza licencyjnego podczas uruchamiania, ale dane aktywacyjne, które wymagają tego samego komputera w celu weryfikacji (w przeciwnym razie dane byłyby inne, a podpis cyfrowy nie sprawdzałby poprawności).

  3. Cóż, po prostu wyeliminuj zbędne znaki, takie jak „1”, „l”, „0”, „o” z klawiszy. Podziel ciąg klucza licencyjnego na grupy znaków.


8
Czy nie mogliby po prostu edytować kodu dodającego / usuwającego oprogramowanie, tak aby sprawdzenie zostało całkowicie pominięte?
Pacerier

Czy odpowiedź na numer 1 wymaga zasadniczo usługi aktywacji / dezaktywacji online?
Dan W

2
Chciałbym zwrócić uwagę na to, jak ogromnie lepsza jest ta odpowiedź od innych haszyszów.
Erik Aronesty

1
@Pacerier Klucze licencyjne chronią firmy produkujące oprogramowanie. Modyfikacja exe nie jest jedną z nich.
Erik Aronesty

1
Warto zauważyć, że nawet przy kryptografii asymetrycznej klucze prywatne / publiczne nadal można wygenerować fałszywe licencje, po prostu zastępując klucz publiczny dostarczony w oprogramowaniu innym kluczem publicznym i używając odpowiedniego klucza prywatnego do podpisania fałszywej licencji. Właśnie dlatego mamy i potrzebujemy zaufanych urzędów certyfikacji BTW, które wiążą klucze publiczne z tożsamościami. Chociaż może to dodać jeszcze jednego obręczy do przeskoczenia, samo w sobie nie gwarantuje # 1.
Saeb Amini

76

Prosta odpowiedź - bez względu na to, jakiego schematu używasz, możesz go złamać.

Nie karaj uczciwych klientów systemem, który ma zapobiegać hakerom, ponieważ hakerzy złamią go niezależnie od tego.

Prosty skrótowy kod powiązany z ich adresem e-mail lub podobnym jest prawdopodobnie wystarczająco dobry. Identyfikatory sprzętowe zawsze stają się problemem, gdy ludzie muszą ponownie zainstalować lub zaktualizować sprzęt.

Dobry wątek na ten temat: http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34


2
zgadzasz się, nie chcesz denerwować użytkowników, którzy faktycznie kupują Twój produkt! (zwróć uwagę na m $, jabłko itp.)
Jason

2
MS, Apple itp. Mogą sobie z tym poradzić, ponieważ są duże i zapewniają podstawowe produkty, które trudno uzyskać gdzie indziej lub mają duży cień rynkowy, którego mogą użyć, aby zmusić ludzi. Mały twórca nie może.
szkuner

1
schematu podpisywania kluczy pub / priv nie można „złamać” w celu wygenerowania nowych prawidłowych kluczy dla użytkowników, którzy chcą uruchamiać podpisany kod pobrany z witryny wydawcy zamiast złamanego oprogramowania. podczas gdy schemat mieszania / symetryczny może zostać złamany w celu wygenerowania nowych ważnych kluczy licencyjnych, których nie można odróżnić od niepoprawnych. Duża różnica.
Erik Aronesty

Zepsuty link ....
stigzler

56

Podczas generowania klucza nie zapomnij o połączeniu wersji i numeru kompilacji z ciągiem, na którym obliczasz skrót. W ten sposób nie będzie jednego klucza, który odblokuje wszystko, co kiedykolwiek wydałeś.

Gdy znajdziesz jakieś klucze lub łatki unoszące się w astalavista.box.sk , będziesz wiedział, że udało ci się stworzyć coś na tyle popularnego, że ktoś chciał się złamać. Cieszyć!


8
„nie zapomnij połączyć wersji i numeru kompilacji z ciągiem, na którym obliczasz wartość skrótu” - ale czy nie spowoduje to złamania klucza, gdy użytkownik zaktualizuje wersję niewielkiej poprawki?
thomthom

1
@thomthom Co powiesz na skojarzenie maksymalnej wersji z kluczem? Sam pomysł wersji jest wiarygodny i zapewnia większe bezpieczeństwo
Marvin Thobejane

@MarvinThobejane, aby skojarzyć maksymalny numer wersji, możesz podpisać maksymalny numer wersji i pozwolić mu na iterację wersji. ale no> = operacje dozwolone w sigs.
Erik Aronesty

22

Poza tym, co już zostało powiedziane ....

Każde użycie aplikacji .NET jest z natury możliwe do złamania z powodu problemów z językiem pośrednim. Prosty demontaż kodu .NET otworzy Twój produkt dla każdego. W tym momencie mogą łatwo ominąć kod licencyjny.

Nie można nawet użyć wartości sprzętowych do utworzenia klucza. Maszyny wirtualne pozwalają teraz komuś stworzyć obraz „licencjonowanej” maszyny i uruchomić ją na dowolnej platformie, którą wybiorą.

Jeśli jest to drogie oprogramowanie, istnieją inne rozwiązania. Jeśli nie, po prostu utrudnij przypadkowemu hakerowi. I zaakceptuj fakt, że w końcu będą tam nielicencjonowane kopie.

Jeśli Twój produkt jest skomplikowany, nieodłączne problemy ze wsparciem zapewnią ci pewną ochronę.


9
+1 za zapobieganie słabości wartości sprzętowych z powodu maszyn wirtualnych.
Rubens Mariuzzo

3
Do tego właśnie służy silne nazewnictwo dla .NET i Authenticode do podpisywania PE. Jeśli ktoś zdekompiluje, zmodyfikuje i przebuduje bibliotekę, nie zostanie ona podpisana, a aplikacja po prostu nie będzie działać. Maszyna wirtualna .NET nie pozwoli na to.
Stephen Tunney

2
Podpisywanie służy do sprawdzania pochodzenia programu, który uruchomisz. Jeśli użytkownik nie dba o pochodzenie, ponieważ wie, że jest zmodyfikowany i złamany, cracker usunie podpis, a nawet podpisze go swoim podpisem. Podpisywanie przestaje mieszać zaufane zestawy z niezaufanymi zestawami.
jesusduarte

aplikację mobilną można wykorzystać jako sprzętowy klucz sprzętowy dla drogiego oprogramowania ... po prostu zapłać za pomocą aplikacji i umieść klucz do podpisywania w bezpiecznym elemencie aplikacji. następnie możesz aktywować za pomocą aplikacji Desktop + ... dezaktywując drugi pulpit. kolokowanie niektórych obszarów kodu sekcji krytycznych w aplikacji i / lub w usługach homomorficznych obliczeń online może pomóc w zapobieganiu trywialnej dekompilacji.
Erik Aronesty

12

Silnik C # / .NET, którego używamy do generowania kluczy licencyjnych, jest teraz obsługiwany jako open source:

https://github.com/appsoftware/.NET-Licence-Key-Generator .

Opiera się na systemie „Częściowej Weryfikacji Klucza”, co oznacza, że ​​tylko podzbiór klucza, którego używasz do wygenerowania klucza, musi zostać wkompilowany do twojej dystrybucji. Sam tworzysz klucze, więc implementacja licencji jest unikalna dla twojego oprogramowania.

Jak wspomniano powyżej, jeśli kod można zdekompilować, stosunkowo łatwo można obejść większość systemów licencjonowania.


Czy chciałbyś zrobić samouczek korzystania z tego produktu? Trochę brakuje mi ich wiki.
Anthony Ruffino,

Projekt został teraz otwarty na GitHub, jeśli to pomaga (odpowiedź edytowana za pomocą linku).
gb2d

10

Jestem jednym z programistów platformy licencjonowania oprogramowania Cryptolens i pracuję nad systemami licencjonowania od 14 roku życia. W tej odpowiedzi zamieściłem kilka wskazówek opartych na doświadczeniu zdobytym przez lata.

Najlepszym sposobem na rozwiązanie tego problemu jest skonfigurowanie serwera kluczy licencyjnych, który będzie wywoływał każde wystąpienie aplikacji w celu weryfikacji klucza licencyjnego.

Korzyści z serwera kluczy licencyjnych

Zalety serwera kluczy licencyjnych polegają na tym, że:

  1. zawsze możesz zaktualizować lub zablokować klucz licencyjny ze skutkiem natychmiastowym.
  2. każdy klucz licencyjny może być zablokowany na określonej liczbie komputerów (pomaga to użytkownikom nie opublikować klucza licencyjnego online, aby inni mogli z niego korzystać).

Uwagi

Chociaż weryfikacja licencji online daje większą kontrolę nad każdą instancją aplikacji, połączenie internetowe nie zawsze jest obecne (szczególnie jeśli kierujesz reklamy do większych przedsiębiorstw), dlatego potrzebujemy innego sposobu przeprowadzania weryfikacji klucza licencyjnego.

Rozwiązaniem jest zawsze podpisywanie odpowiedzi klucza licencyjnego z serwera za pomocą kryptosystemu klucza publicznego, takiego jak RSA lub ECC (być może lepiej, jeśli planujesz uruchomić na systemach wbudowanych). Twoja aplikacja powinna mieć tylko klucz publiczny do weryfikacji odpowiedzi klucza licencyjnego.

Jeśli więc nie ma połączenia z Internetem, możesz użyć poprzedniej odpowiedzi klucza licencyjnego. Pamiętaj, aby przechowywać w odpowiedzi zarówno datę, jak i identyfikator komputera i sprawdź, czy nie jest on zbyt stary (np. Zezwalasz użytkownikom na wyłączanie się przez co najwyżej 30 dni itp.) Oraz czy odpowiedź klucza licencyjnego należy do właściwego urządzenia.

Pamiętaj, że zawsze powinieneś sprawdzać certyfikat odpowiedzi klucza licencyjnego, nawet jeśli masz połączenie z Internetem), aby upewnić się, że nie został on zmieniony, ponieważ opuścił serwer (to nadal musi być zrobione, nawet jeśli interfejs API do serwer kluczy licencyjnych używa https)

Ochrona tajnych algorytmów

Większość aplikacji .NET można dość łatwo poddać inżynierii wstecznej (Microsoft udostępnia zarówno diassembler do pobierania kodu IL, jak i niektóre produkty komercyjne mogą nawet odzyskać kod źródłowy np. W C #). Oczywiście zawsze możesz zaciemnić kod, ale nigdy nie jest w 100% bezpieczny.

W większości przypadków celem każdego rozwiązania w zakresie licencjonowania oprogramowania jest pomoc uczciwym ludziom w uczciwości (tj. Uczciwi użytkownicy, którzy są gotowi zapłacić, nie zapominają o płatności po wygaśnięciu wersji próbnej itp.).

Jednak nadal możesz mieć kod, którego w żadnym wypadku nie chcesz ujawnić publicznie (np. Algorytm do przewidywania cen akcji itp.). W takim przypadku jedynym sposobem jest utworzenie punktu końcowego interfejsu API, który aplikacja będzie wywoływać za każdym razem, gdy metoda powinna zostać wykonana. Wymaga połączenia z Internetem, ale zapewnia, że ​​Twój tajny kod nigdy nie zostanie wykonany przez maszynę klienta.

Realizacja

Jeśli nie chcesz wdrażać wszystkiego samodzielnie, polecam rzucić okiem na ten samouczek (część Cryptolens )


Jedno pytanie dotyczące ograniczenia zapisanego klucza licencyjnego do tego, że nie jest za stary: Ponieważ komputer PC może nie być podłączony do Internetu, jego datę i godzinę można zawsze zmienić z powrotem, aby pozostać w tym samym ważnym dniu?
Amir Mahdi Nassiri,

Czy użytkownicy nie mogą ominąć serwera licencji online, definiując host sprzężenia zwrotnego w systemie Windows? Widziałem wiele takich pirackich aplikacji, z których pamiętam Resharper i Matlab.
Amir Mahdi Nassiri,

1
@AmirMahdiNassiri Na pytanie 1: Jeśli komputer jest na stałe offline, możesz użyć klucza zegara czasu rzeczywistego (RTC) jako zaufanego źródła czasu. W przypadku pytania 2: ponieważ odpowiedź jest podpisana kluczem prywatnym dostawcy (i zweryfikowana za pomocą klucza publicznego w aplikacji), przeciwnik musiałby ponownie podpisać plik bez znajomości klucza prywatnego, który w momencie pisania jest niemożliwe z 2048-bitowymi kluczami RSA.
Artem

7

W przeszłości używałem Crypkey . Jest to jeden z wielu dostępnych.

Oprogramowanie można chronić tylko do pewnego momentu za pomocą dowolnego schematu licencyjnego.


6

Nie wiem, jak bardzo chcesz się starać

ale wierzę, że .net może uzyskać dostęp do numeru seryjnego dysku twardego.

możesz mieć program, który ci to wyśle ​​i coś innego (np. nazwę użytkownika i adres MAC nic)

na tej podstawie obliczasz kod i wysyłasz mu e-mailem klucz.

powstrzymają ich przed zamianą maszyn po otrzymaniu klucza.


4
I powstrzymaj ich przed zastąpieniem martwego HD wśród innych rzeczy, co doprowadzi do frustracji. Niestety nie ma łatwej odpowiedzi, musisz zrównoważyć zaufanie z podstawowymi mechanizmami licencjonowania.
szkuner

Pracował wiele lat jako inżynier oprogramowania przy produkcie, który używał numeru seryjnego poza dyskiem HD, był całkowicie niepewny dla tych, którzy wiedzieli, jak go zaktualizować.
oden

Sugerowałem użycie tego numeru do innych rzeczy (adres MAC, FQDN), być może wrzucę je wszystkie w hasz. Chodzi o to, aby nieco trudniej było sfałszować wszystkie te dane, niż w pierwszej kolejności cofnąć oprogramowanie i usunąć kontrolę, ponieważ to zawsze jest opcja.
Crash893,

4

Jedynym sposobem na zrobienie wszystkiego, o co prosiłeś, jest wymaganie dostępu do Internetu i weryfikacji za pomocą serwera. Aplikacja musi zalogować się na serwerze za pomocą klucza, a następnie musisz zapisać szczegóły sesji, takie jak adres IP. Zapobiegnie to użyciu klucza na kilku różnych komputerach. Zwykle nie jest to zbyt popularne wśród użytkowników aplikacji i jeśli nie jest to bardzo droga i skomplikowana aplikacja, nie jest tego warta.

Możesz po prostu mieć klucz licencyjny dla aplikacji, a następnie sprawdzić po stronie klienta, czy klucz jest dobry, ale łatwo jest przekazać ten klucz innym użytkownikom, a dzięki dekompilatorowi można wygenerować nowe klucze.


5
Pracowałem w firmie, która korzystała z internetowego systemu licencjonowania. myślę, że za każdym razem, gdy program był uruchamiany w trybie online, firma wydawała więcej $$ na infrastrukturę i programistów na swoje rozwiązania licencyjne, niż straciliby z piractwa (byli niszowym produktem).
Jason

3
ponadto koszty pomocy technicznej były ogromne. wiele, WIELE razy użytkownik legalnie używałby innego komputera, aby spróbować uruchomić oprogramowanie, ale skrót był inny, co doprowadziło do ogromnego wsparcia technicznego. w skrócie, co powiedział szkuner - nie karaj uczciwych użytkowników.
Jason

1
Wygląda na to, że Twoja firma była trochę nadgorliwa, wymagając za każdym razem sprawdzania poprawności podczas uruchamiania.
jugg1es

@Jason, Cóż, powinni podnieść cenę produktu.
Pacerier

1
@Pacerier: Zła odpowiedź.
Wyścigi lekkości na orbicie

4

Wdrożyłem jednorazową aktywację internetową w oprogramowaniu mojej firmy (C # .net), która wymaga klucza licencyjnego, który odnosi się do licencji przechowywanej w bazie danych serwera. Oprogramowanie uderza serwer kluczem i otrzymuje informacje o licencji, które są następnie szyfrowane lokalnie za pomocą klucza RSA wygenerowanego z niektórych zmiennych (kombinacji CPUID i innych rzeczy, które nie będą się często zmieniać) na komputerze klienckim, a następnie zapisuje je w rejestr.

Wymaga to trochę kodowania po stronie serwera, ale działało dla nas naprawdę dobrze i mogłem korzystać z tego samego systemu, kiedy rozszerzyliśmy się o oprogramowanie oparte na przeglądarce. Daje również sprzedawcom świetne informacje o tym, kto, gdzie i kiedy oprogramowanie jest używane. Każdy system licencjonowania obsługiwany tylko lokalnie jest w pełni podatny na wykorzystanie, szczególnie w przypadku .NET . Ale, jak wszyscy mówili, żaden system nie jest całkowicie bezpieczny.

Moim zdaniem, jeśli nie korzystasz z licencjonowania internetowego, ochrona oprogramowania nie ma żadnego sensu. Z powodu bólu głowy, jaki może powodować DRM, niesprawiedliwe jest dla użytkowników, którzy faktycznie zapłacili za to cierpienie.


1
Ale głównym problemem związanym z licencjonowaniem sieciowym jest to, że usługa licencjonowania staje się głównym celem ataków DDoS. Które albo paraliżują usługę, albo zwiększają koszty chmury.
afk5min

4
To tak, jakby powiedzieć, że nie ma sensu mieć strony internetowej, ponieważ jest podatna na ataki DDoS ...
jugg1es

@ jugg1es Nigdzie w swoim komentarzu nie powiedział „nie ma sensu”. Po prostu zwrócił uwagę na fakt, że należy wziąć pod uwagę tę podatność.
Dan Bechard,

Czeki można nadal usunąć w kliencie. Bez czeków, bez licencji internetowych ...
Azarai

1
Czy masz na myśli kod aplikacji z „wymaganymi informacjami”? Kod, który byłby niezbędny do uruchomienia aplikacji? W przeciwnym razie pomyślałem, że nadal spowoduje wywołanie metod sprawdzania isLicensed w jednym kodzie.
azarai

4

Mocno wierzę, że tylko system licencjonowania oparty na kryptografii klucza publicznego jest tutaj właściwym podejściem, ponieważ nie musisz dołączać niezbędnych informacji do wygenerowania licencji do swojego kodu źródłowego.

W przeszłości wiele razy korzystałem z Biblioteki licencyjnej Treka , ponieważ spełnia ona te wymagania i oferuje naprawdę dobrą cenę. Używa tej samej ochrony licencji dla użytkowników końcowych i dla siebie i nikt tego nie złamał. Możesz również znaleźć dobre wskazówki na stronie internetowej, aby uniknąć piractwa i włamań.


Czy kryptografia klucza publicznego wymagałaby korzystania z usługi aktywacji online? Mam na myśli, jeśli nie ma go w kodzie źródłowym (zakładam, że masz na myśli również plik wykonywalny), gdzie jeszcze mógłby być?
Dan W

Nie, nie musisz korzystać z usługi aktywacji online. Możesz wygenerować pliki licencji całkowicie offline.
panpernicek

Kluczem jest to, że umieszczasz tylko klucz publiczny do kodu, którego nie można użyć do wygenerowania licencji. Tylko do weryfikacji.
panpernicek,

3

Jak kilku innych wspomnianych, jestem ogromnym przeciwnikiem domyślnej wrogości wobec klientów - coś, z czego przemysł licencjonowania jest znany. Więc rozwinę dobre rozwiązanie twojego problemu, które oferuje również dobry interfejs użytkownika .

Na początek wspomniałeś, że masz „ograniczoną” wersję oprogramowania, którego używasz do próby przekonwertowania klientów na „uaktualnienie” w celu uzyskania dodatkowych funkcji. Więc co szukasz są licencje funkcji dla danego produktu, np klient może zakupić licencję dla funkcji-X lub funkcji Y .

Zbudowałem Keygen z myślą o tego rodzaju licencjach. Keygen to licencjonowany interfejs API REST, który pozwala zarządzać kontami użytkowników, licencjami, a także śledzić wykorzystanie / powiązania maszyn.

Chciałbym skonfigurować 2 typy licencji ( polisa w Keygen), gdzie jedna jest polisą podstawową dla ograniczonej wersji darmowej, a druga polisą dla wersji płatnej.

Nie jestem pewien, czego używasz do płatności, ale załóżmy, że używasz czegoś takiego jak Stripe (obecnie dość standardowy), który oferuje haczyki internetowe . Keygen ma również haki internetowe (niezależnie od tego, czy z niego korzystasz, czy nie, wszystko to nadal obowiązuje). Możesz zintegrować Keygen, aby rozmawiać z dostawcą płatności za pomocą haczyków internetowych z obu stron (pomyśl: customer.created-> utwórz licencję podstawową dla klienta, license.created-> obciąż klienta za nową licencję).

Dzięki wykorzystaniu haków internetowych możemy zautomatyzować tworzenie licencji dla nowych klientów. A co z weryfikacją licencji w samej aplikacji? Można to zrobić na wiele sposobów, ale najbardziej popularnym jest wymaganie od klienta wprowadzenia długiego klucza licencyjnego w polu wejściowym, które można następnie zweryfikować; Myślę, że to okropny sposób na sprawdzenie poprawności licencji w twojej aplikacji.

Dlaczego tak myślę? Po pierwsze, wymagasz od klienta wprowadzenia żmudnie długiego klucza licencyjnego przeznaczonego na zużycie maszyny, a po drugie, wymaganie od ciebie i twojego klienta śledzenia tego żmudnie długiego klucza licencyjnego .

Okej, więc jaka jest alternatywa? Myślę, że najlepszą alternatywą jest zrobienie czegoś, do czego wszyscy klienci są przyzwyczajeni: umożliwienie im utworzenia konta dla twojego produktu za pomocą adresu e-mail / hasła . Następnie możesz powiązać wszystkie ich licencje i ich maszyny z tym kontem. Teraz zamiast wprowadzać klucz licencyjny, mogą po prostu zalogować się przy użyciu swoich poświadczeń.

Jakie to daje ci korzyści? Po pierwsze, pozbywa się potrzeby śledzenia kluczy licencyjnych przez ciebie i twoich klientów, ponieważ wszystko to jest obsługiwane za kulisami na koncie użytkownika, a co najważniejsze: możesz teraz oferować klientom samoobsługową licencję i maszynę aktywacja! tzn. ponieważ wszystkie ich licencje i komputery są powiązane z ich kontem użytkownika, możesz poprosić ich o zakup licencji, gdy uruchomią aplikację na nierozpoznanym komputerze.

Teraz do sprawdzania licencji : ilekroć dzienniki klientów do aplikacji z ich e-mail / hasło, można wyszukać swoje konto użytkownika na licencji są właścicielami w celu ustalenia, czy mogą wykorzystywać funkcje X lub funkcja-Y . A ponieważ Twoja aplikacja jest teraz samoobsługowa , możesz pozwolić klientom na zakup dodatkowych funkcji bezpośrednio z poziomu aplikacji!

Dlatego wprowadziliśmy mnóstwo automatyzacji do naszego systemu licencyjnego, możemy licencjonować poszczególne funkcje (tj. Wersję ograniczoną vs. pełną), zaoferowaliśmy naszym klientom niesamowity UX, a także złagodziliśmy jeden z największych powodów w przypadku wniosków o wsparcie: odzyskiwanie klucza licencyjnego.

W każdym razie to trwało długo, ale mam nadzieję, że komuś pomaga!


Nie wyobrażam sobie takiej biblioteki DLL na taką licencję w jakiejkolwiek sytuacji programistycznej. Pomyśl na przykład o automatycznych scenariuszach kompilacji i wdrażania. Lub po prostu dodając ten krok do wielu zwykle wymaganych do skonfigurowania maszyny programisty. Dla mnie klucze licencyjne muszą być wstępnie wydane, a nie oparte na poszczególnych komputerach, aby były praktyczne
DvS

2

Nie można całkowicie zapobiec piractwu oprogramowania. Możesz zapobiec przypadkowemu piractwu i to właśnie robią wszystkie rozwiązania licencyjne.

Licencjonowanie zablokowane w węźle (maszynowym) jest najlepsze, jeśli chcesz zapobiec ponownemu użyciu kluczy licencyjnych. Używam Cryptlex od około roku do mojego oprogramowania. Ma również bezpłatny plan , więc jeśli nie spodziewasz się zbyt wielu klientów, możesz go użyć za darmo.


2

Możesz skorzystać z darmowego rozwiązania innej firmy, aby poradzić sobie z tym za Ciebie, takiego jak Quantum-Key.Net Jest bezpłatny i obsługuje płatności przez PayPal za pośrednictwem strony internetowej, którą dla Ciebie tworzy, wydawania kluczy przez e-mail i blokowania użycia klucza na określonym komputerze, aby zapobiegać piractwu.

Powinieneś również zadbać o zaciemnienie / zaszyfrowanie swojego kodu lub można go łatwo poddać inżynierii wstecznej za pomocą oprogramowania takiego jak De4dot i .NetReflector. Dobrym darmowym zaciemniaczem kodu jest ConfuserEx, który jest szybki i prosty w użyciu i skuteczniejszy niż drogie alternatywy.

Powinieneś uruchomić gotowe oprogramowanie za pośrednictwem De4Dot i .NetReflector, aby poddać go inżynierii wstecznej i zobaczyć, co zobaczyłby cracker, gdyby zrobił to samo i upewnić się, że nie pozostawiłeś żadnego ważnego kodu odsłoniętego lub ukrytego.

Twoje oprogramowanie będzie nadal nadawać się do krakowania, ale dla zwykłego crackera może być wystarczające, aby je odłożyć, a te proste kroki zapobiegną również wyodrębnieniu i ponownemu użyciu kodu.

https://quantum-key.net

Jak korzystać z ConfuserEx?

https://github.com/0xd4d/de4dot

https://www.red-gate.com/dynamic/products/dotnet-development/reflector/download

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.