Jak generowane są klucze licencyjne oprogramowania?

361

Klucze licencyjne są standardem defacto jako środek antypiracki. Szczerze mówiąc, uderza mnie to jako (in) Security Through Obscurity , chociaż tak naprawdę nie mam pojęcia, w jaki sposób generowane są klucze licencyjne. Jaki jest dobry (bezpieczny) przykład generowania klucza licencyjnego? Z jakich prymitywów kryptograficznych (jeśli w ogóle) korzystają? Czy to skrót wiadomości? Jeśli tak, jakie dane byłyby mieszane? Jakie metody stosują programiści, aby utrudnić crackerom zbudowanie własnych generatorów kluczy? Jak powstają generatory kluczy?

wieża
źródło
8
+1 ciekawe pytanie, może odpowiadający może opublikować linki do dobrych zasobów na ten temat do dalszego czytania? proszę :)
Jacob
44
Wszystkie schematy DRM są w istocie schematami ukrytymi, ponieważ cały kod i dane niezbędne do uruchomienia programu zostały dostarczone użytkownikowi. Schemat można dowolnie zaciemnić, aby utrudnić łatanie, ale jest pewne, że kod można załatać, aby uniknąć jakiejkolwiek kontroli.
caf
5
Klucze CD są rzeczywiście zabezpieczeniem poprzez niejasność. Istnieje kilka sposobów ich zbudowania, ale wszystkie muszą polegać na osadzeniu w programie pewnej tajemnicy, która jest wymagana do weryfikacji klucza.
Nick Johnson,
4
Nazywa się je teraz kluczami produktu lub kluczami licencyjnymi , ponieważ większość oprogramowania, które ich używa, jest bardziej prawdopodobne, że zostanie dostarczona online niż przez cd.
Joel Coehoorn,
4
Chciałbym kiedyś stworzyć aplikację, w której musiałbym się martwić tym rodzajem marzeń z dzieciństwa. Aplikacje internetowe po prostu tego nie wycinają.
Znarkus,

Odpowiedzi:

268

W przypadku old-schoolowych kluczy CD wystarczyło stworzyć algorytm, dla którego klucze CD (które mogą być dowolnym ciągiem) można łatwo wygenerować i zweryfikować, ale stosunek prawidłowych kluczy CD do nieprawidłowych płyt CD -klucze są tak małe, że losowe zgadywanie kluczy CD raczej nie zapewni prawidłowego klucza.

NIEPRAWIDŁOWY SPOSÓB TO ROBIĆ:

Zarówno Starcraft, jak i Half-life wykorzystały tę samą sumę kontrolną, gdzie 13 cyfra zweryfikowała pierwszą 12. W związku z tym możesz wprowadzić cokolwiek dla pierwszych 12 cyfr i odgadnąć 13 (istnieje tylko 10 możliwości), co prowadzi do niesławnego1234-56789-1234

Algorytm weryfikacji jest publiczny i wygląda mniej więcej tak:

x = 3;
for(int i = 0; i < 12; i++)
{
    x += (2 * x) ^ digit[i];
}
lastDigit = x % 10;

PRAWIDŁOWY SPOSÓB TO ZROBIĆ

Windows XP pobiera sporo informacji, szyfruje je i umieszcza kodowanie litery / cyfry na naklejce. Umożliwiło to MS zarówno zweryfikowanie twojego klucza, jak i uzyskanie typu produktu (Home, Professional itp.) W tym samym czasie. Dodatkowo wymaga aktywacji online.
Pełny algorytm jest dość złożony, ale ładnie zarysowany w tym (całkowicie legalnym!) Artykule opublikowanym w Niemczech.

Oczywiście, bez względu na to, co robisz, chyba że oferujesz usługę online (taką jak World of Warcraft ), każdy rodzaj ochrony przed kopiowaniem jest po prostu przeciągnięciem: niestety, jeśli jest to gra warta wartości, ktoś się zepsuje (lub przynajmniej obejdzie ) algorytm klucza CD i wszystkie inne zabezpieczenia praw autorskich.

PRAWDZIWY PRAWIDŁOWY SPOSÓB TO ROBIĆ:

W przypadku usług online życie jest nieco prostsze, ponieważ nawet w przypadku pliku binarnego musisz uwierzytelnić się na ich serwerach, aby móc z niego skorzystać (np. Mieć konto WoW). Algorytm klucza CD dla World of Warcraft - używany na przykład przy zakupie kart playtime - prawdopodobnie wygląda mniej więcej tak:

  1. Wygeneruj bardzo dużą, bezpieczną kryptograficznie liczbę losową.
  2. Zapisz go w naszej bazie danych i wydrukuj na karcie.

    Następnie, gdy ktoś wpisze numer karty czasu odtwarzania, sprawdź, czy jest on w bazie danych, a jeśli tak, to powiąż ten numer z bieżącym użytkownikiem, aby nie mógł zostać użyty ponownie.

W przypadku usług online nie ma powodu, aby nie korzystać z powyższego schematu; używanie czegokolwiek innego może prowadzić do problemów .

BlueRaja - Danny Pflughoeft
źródło
47
Mathematica ma ciekawy proces. Produkt jest dostarczany z unikalnym kluczem, a plik instalacyjny generuje drugi unikalny klucz (na podstawie sprzętu). Oba klucze należy wprowadzić w formularzu online z imieniem i nazwiskiem oraz informacjami rejestracyjnymi, a następnie wyślą prawdziwy klucz oparty na tych dwóch kluczach, które faktycznie odblokowują oprogramowanie, ale tylko dla tego konkretnego klucza produktu i określonego sprzętu.
Dan
18
Hej, nigdy nie wiedziałem o 1234-56789-1234kluczu StarCrafta, ale pamiętam, że zajęło to tylko około pięciu minut, aby „brutalnie wymusić” weryfikatora przez zaciśnięcie na klawiaturze i ponowienie próby.
fmark
18
Pamiętam również niektóre produkty Microsoft w przeszłości, które pozwalają używać 111-1111111 jako prawidłowego klucza CD (Visual Studio 6.0)
Hannson
25
Nigdy nie wiedziałem o 1234-56789-1234. Zamiast tego wykorzystaliśmy trzynaście trójek! 3333333333333
ErikTJ
33
Problem z aktywacją online polega na tym, że wszyscy mamy problemy, jeśli / kiedy wydawca przestanie działać. Proszę nie rób tego. Zdarza się to i może kiedyś przytrafić się nawet Microsoftowi.
Brad
56

Kiedy pierwotnie napisałem tę odpowiedź, zakładałem, że pytanie dotyczyło sprawdzania poprawności kluczy licencyjnych w trybie offline. Większość innych odpowiedzi dotyczy weryfikacji online, co jest znacznie łatwiejsze w obsłudze (większość logiki można wykonać po stronie serwera).

W przypadku weryfikacji offline najtrudniejszą rzeczą jest upewnienie się, że możesz wygenerować ogromną liczbę unikalnych kluczy licencyjnych i nadal utrzymywać silny algorytm, którego nie można łatwo złamać (np. Prosta cyfra kontrolna)

Nie jestem zbyt dobrze zaznajomiony z matematyką, ale uderzyło mnie, że jednym ze sposobów jest użycie funkcji matematycznej, która tworzy wykres

Narysowana linia może mieć (jeśli zastosujesz wystarczająco wysoką częstotliwość) tysiące unikalnych punktów, dzięki czemu możesz generować klucze, wybierając losowe punkty na tym wykresie i w pewien sposób kodując wartości

wprowadź opis zdjęcia tutaj

Jako przykład wykreślimy ten wykres, wybierzmy cztery punkty i zakodujemy w ciąg znaków jako „0, -500; 100, -300; 200, -100; 100,600”

Zaszyfrujemy ciąg znanym i stałym kluczem (okropnie słaby, ale służy to celowi), a następnie przekonwertujemy powstałe bajty przez Base32, aby wygenerować ostateczny klucz

Aplikacja może następnie odwrócić ten proces (base32 na liczbę rzeczywistą, odszyfrować, zdekodować punkty), a następnie sprawdzić, czy każdy z tych punktów znajduje się na naszym tajnym wykresie.

Jest to dość niewielka ilość kodu, który pozwoliłby wygenerować ogromną liczbę unikalnych i poprawnych kluczy

Jest to jednak bardzo duże bezpieczeństwo przez zaciemnienie. Każdy, kto poświęci czas na zdemontowanie kodu, będzie w stanie znaleźć funkcję graficzną i klucze szyfrujące, a następnie naszkicować generator kluczy, ale prawdopodobnie jest to całkiem przydatne do spowolnienia przypadkowego piractwa.

PaulG
źródło
6
Nie, Erik nie zrobiłby tego. X jest liczbą całkowitą, a Y jest dolną częścią funkcji.
Joshua
Nie inaczej jest, jak działała stara nawigacja satelitarna przed GPS! youtube.com/watch?v=BBOsQBuCJfs
Brad
34

Przeczytaj ten artykuł na temat częściowej weryfikacji klucza, który obejmuje następujące wymagania:

  • Klucze licencyjne muszą być łatwe do wpisania.

  • Musimy mieć możliwość umieszczenia na czarnej liście (unieważnienia) klucza licencyjnego w przypadku obciążeń zwrotnych lub zakupów za pomocą skradzionych kart kredytowych.

  • Brak „dzwonienia do domu” w celu przetestowania kluczy. Chociaż ta praktyka staje się coraz bardziej powszechna, nadal nie doceniam jej jako użytkownika, więc nie będę prosić moich użytkowników, aby się z tym pogodzili.

  • Nie powinno być możliwe, aby cracker zdemontował naszą wydaną aplikację i stworzył z niej działający „keygen”. Oznacza to, że nasza aplikacja nie przetestuje w pełni klucza do weryfikacji. Tylko część klucza ma zostać przetestowana. Ponadto w każdej wersji aplikacji należy przetestować inną część klucza, aby fałszywy klucz oparty na wcześniejszej wersji nie działał w późniejszej wersji naszego oprogramowania.

  • Ważne: prawowity użytkownik nie powinien mieć możliwości przypadkowego wpisania nieprawidłowego klucza, który wydaje się działać, ale zawiedzie w przyszłej wersji z powodu błędu typograficznego.

Surrican
źródło
21

Nie mam doświadczenia z tym, co ludzie robią, aby generować klucze CD, ale (zakładając, że nie chcesz iść drogą aktywacji online), oto kilka sposobów na zrobienie klucza:

  • Wymagaj, aby liczba była podzielna przez (powiedzmy) 17. Trywialne zgadywanie, jeśli masz dostęp do wielu kluczy, ale większość potencjalnych ciągów znaków będzie niepoprawna. Podobnie wymagałoby to, aby suma kontrolna klucza odpowiadała znanej wartości.

  • Wymagaj, aby pierwsza połowa klucza, po połączeniu ze znaną wartością, skróciła się do drugiej połowy klucza. Lepiej, ale program nadal zawiera wszystkie informacje potrzebne do generowania kluczy, a także do ich sprawdzania.

  • Generuj klucze, szyfrując (kluczem prywatnym) znaną wartość + nonce. Można to zweryfikować poprzez odszyfrowanie przy użyciu odpowiedniego klucza publicznego i sprawdzenie znanej wartości. Program ma teraz wystarczającą ilość informacji, aby zweryfikować klucz bez możliwości generowania kluczy.

Nadal wszystkie są otwarte na atak: program jest nadal dostępny i można go załatać, aby ominąć kontrolę. Bardziej sprytne może być szyfrowanie części programu przy użyciu znanej wartości z mojej trzeciej metody, zamiast zapisywania wartości w programie. W ten sposób musisz znaleźć kopię klucza, zanim będziesz mógł odszyfrować program, ale nadal jest podatny na kopiowanie po odszyfrowaniu oraz na to, aby jedna osoba wzięła swoją legalną kopię i wykorzystała go, aby umożliwić wszystkim innym dostęp do oprogramowania.

Andrew Aylett
źródło
9
Naprawdę chciałbym, kto miał wymyślić „użytego numeru raz” rzecz nie wybrał nonce jak nazwa, biorąc pod uwagę ahem negatywne konotacje, które sprawiają mi chichot za każdym razem ktoś sugeruje szyfrujące jeden.
Ed James
2
Zauważ, że trzecia opcja nie działa z kluczami symetrycznymi, ponieważ atakujący może po prostu przerobić test na zwykły tekst, wygenerować coś, co przechodzi, a następnie zaszyfrować go (znanym) kluczem i (znanym) szyfrem. Korzystanie z domowego szyfru do parzenia nie jest rozwiązaniem, ponieważ jeśli możesz to zrobić samodzielnie, powinieneś znaleźć pracę w NSA.
BCS,
@BCS: Przepraszam, powinienem być bardziej zrozumiały w kwestii korzystania z szyfrowania z kluczem publicznym.
Andrew Aylett,
Użyj schematu podpisu, a nie schematu szyfrowania dla wersji klucza publicznego. (Podpis RSA wygląda trochę jak „szyfrowanie za pomocą klucza publicznego”, ale nie jest to całkowicie to samo. Istnieją inne schematy podpisów, które nie mają powiązanego schematu szyfrowania, takie jak DSA.)
Paŭlo Ebermann
Problem z kryptografią klucza publicznego polega na tym, że klucze (a zatem i numery seryjne) muszą być długie. 512-bitowa para kluczy RSA nie jest dziś trudna do złamania. Porównaj z kluczami WinXP (5 grup po 5 znaków alfanumerycznych), które mają tylko 128 bitów entropii, ale wciąż
trudno
17

Klucze CD nie stanowią większego bezpieczeństwa dla żadnych nie podłączonych do sieci rzeczy, więc technicznie nie trzeba ich bezpiecznie generować. Jeśli korzystasz z .net, możesz prawie przejść z Guid.NewGuid ().

Obecnie ich głównym zastosowaniem jest komponent Multiplayer, w którym serwer może zweryfikować klucz CD. W związku z tym nie ma znaczenia, jak bezpiecznie został wygenerowany, ponieważ sprowadza się do „Wyszukaj, co zostało przekazane i sprawdź, czy ktoś już go używa”.

To powiedziawszy, możesz użyć algorytmu, aby osiągnąć dwa cele:

  • Mają jakąś sumę kontrolną. Pozwala to instalatorowi wyświetlić komunikat „Klucz wydaje się niepoprawny” wyłącznie w celu wykrycia literówek (dodanie takiego sprawdzenia w instalatorze w rzeczywistości oznacza, że ​​napisanie generatora kluczy jest trywialne, ponieważ haker ma cały potrzebny kod. sprawdzanie i poleganie wyłącznie na sprawdzaniu poprawności po stronie serwera wyłącza to sprawdzanie, co grozi zirytowaniem legalnych klientów, którzy nie rozumieją, dlaczego serwer nie akceptuje ich klucza CD, ponieważ nie są świadomi literówki)
  • Pracuj z ograniczonym podzbiorem znaków. Próba wpisania klucza CD i zgadywanie „Czy to 8, B, 1, I, Q, O, 0?” - stosując podzbiór niejednoznacznych znaków / cyfr, eliminujesz to zamieszanie.

To powiedziawszy, nadal chcesz dużej dystrybucji i pewnej losowości, aby uniknąć pirata po prostu zgadywania ważnego klucza (który jest ważny w bazie danych, ale wciąż w pudełku na półce sklepowej) i przekręcania legalnego klienta, który akurat kupuje to pudełko .

Michael Stum
źródło
łatwa do rozwiązania dzięki dobrej obsłudze klienta - Box shot + Dowód zakupu = Zablokuj Nielegalny użytkownik, Daj dostęp drugiemu użytkownikowi.
alexanderpas
1
oto kilka dodatkowych przemyśleń na temat kluczy CD codinghorror.com/blog/2007/12/software-registration-keys.html
Richard Chambers
10

Jeśli nie jesteś szczególnie zainteresowany długością klucza, całkiem wypróbowaną i prawdziwą metodą jest użycie szyfrowania klucza publicznego i prywatnego.

Zasadniczo mają jakiś nonce i stały podpis.

Na przykład: 0001-123456789

Gdzie 0001 to twój nonce, a 123456789 to Twój stały podpis.

Następnie zaszyfruj to za pomocą klucza prywatnego, aby uzyskać klucz CD, który jest podobny do: ABCDEF9876543210

Następnie rozpowszechnij klucz publiczny w swojej aplikacji. Klucza publicznego można użyć do odszyfrowania klucza CD „ABCDEF9876543210”, który następnie weryfikuje się w części ze stałym podpisem.

Zapobiega to zgadywaniu, co to jest klucz CD dla nonce 0002, ponieważ nie ma klucza prywatnego.

Jedynym poważnym minusem jest to, że klucze CD będą dość długie przy użyciu kluczy prywatnych / publicznych o rozmiarze 1024-bit. Musisz także wybrać wartość jednorazową, aby nie szyfrować trywialnej ilości informacji.

Zaletą jest to, że ta metoda będzie działać bez „aktywacji” i możesz używać takich rzeczy jak adres e-mail lub nazwa licencjobiorcy jako nonce.

userx
źródło
1
Pamiętaj, że mój przykład rażąco nie docenia długości twojego klucza. Schematy te zwykle wymagają kodowania base64 i wdrożenia kopiuj / wklej, ale pozwalają na niemal niemożliwe odgadnięcie kluczy, które nie są powiązane z maszyną i nie wymagają aktywacji (dwie rzeczy bardzo ważne dla wielu typów klientów)
userx
3
Zamiast RSA możesz użyć krzywych eliptycznych. Używają krótszych kluczy, a ich długość bloku jest mniejsza. Czytając Wiki, wydaje się, że 256-bitowa
karta
Pamiętaj, że podpisy cyfrowe i „szyfrowanie kluczem prywatnym” to nie to samo. W RSA wyglądają podobnie (choć nie są, z powodu różnych schematów wypełniania), inne schematy podpisu nawet nie mają odpowiedniego schematu szyfrowania.
Paŭlo Ebermann,
@xanatos, 256 bitów jest wciąż zbyt długie, aby wpisać ręcznie. Rozważ 25-znakowe klucze używane przez WinXP - mają tylko 128 bitów entropii.
finnw
1
@ Mark - Podpis jest zwykle tylko zaszyfrowanym hashem. Możesz użyć szyfrowania lub podpisywania, moja metoda działa tak samo. Próbujesz tylko utworzyć klucz licencyjny, którego nie można łatwo wygenerować bez klucza prywatnego i który można zweryfikować za pomocą klucza publicznego. Może to być cała zaszyfrowana wiadomość (a Ty upewnisz się, że część jej zawartości pasuje do czegoś magicznego) lub po prostu podpisana wiadomość (i upewnisz się, że podpis jest prawidłowy). To zależy od twojej implementacji.
userx
9

System kluczy musi mieć kilka właściwości:

  • bardzo niewiele kluczy musi być poprawnych
  • prawidłowe klucze nie mogą być możliwe do uzyskania, nawet biorąc pod uwagę wszystko, co użytkownik ma.
  • prawidłowy klucz w jednym systemie nie jest prawidłowym kluczem w innym.
  • inni

Jednym z rozwiązań, które powinno to zapewnić, byłoby użycie schematu podpisywania klucza publicznego . Zacznij od „skrótu systemowego” (powiedz, chwyć Mac na dowolnych kartach sieciowych, posortuj i informacje o CPU-ID, a także kilka innych rzeczy, połącz to wszystko razem i weź MD5 wyniku (naprawdę nie chcesz być obsługa informacji umożliwiających identyfikację, jeśli nie musisz)) dołącz numer seryjny dysku CD i odmów rozruchu, chyba że jakiś klucz rejestru (lub jakiś plik danych) ma prawidłowy podpis dla obiektu blob. Użytkownik aktywuje program, wysyłając kroplę do Ciebie, a Ty wysyłasz podpis.

Potencjalne problemy obejmują to, że proponujesz podpisanie praktycznie wszystkiego, więc musisz założyć, że ktoś przeprowadzi wybrany atak tekstowy i / lub wybrane ataki zaszyfrowane . Można to złagodzić, sprawdzając podany numer seryjny i odmawiając obsługi żądania od nieprawidłowych, a także odmawiając obsługi więcej niż określonej liczby zapytań z danego numeru seryjnego w odstępie czasu (powiedzmy 2 na rok)

Powinienem zwrócić uwagę na kilka rzeczy: po pierwsze, wykwalifikowany i zdeterminowany atakujący będzie w stanie ominąć wszelkie zabezpieczenia w częściach, do których ma nieograniczony dostęp ( tj. Wszystko na płycie CD), najlepiej, co możesz zrobić na tym koncie, to utrudnić uzyskanie nielegalnego dostępu, niż uzyskać legalny dostęp. Po drugie, nie jestem ekspertem, więc w proponowanym programie mogą wystąpić poważne wady.

BCS
źródło
1

Istnieją również zachowania DRM, które obejmują wiele etapów procesu. Jednym z najbardziej znanych przykładów jest jedna z metod Adobe do weryfikacji instalacji pakietu Creative Suite. Stosowana jest tutaj tradycyjna metoda CD Key, a następnie wywoływana jest linia wsparcia Adobe. Klucz CD jest przekazywany przedstawicielowi Adobe, który przekazuje numer aktywacyjny, z którego może korzystać użytkownik.

Jednakże, pomimo rozbicia na etapy, padają ofiarą tych samych metod krakowania, które stosuje się w normalnym procesie. Proces użyty do utworzenia klucza aktywacyjnego, który jest porównywany z oryginalnym kluczem CD, został szybko wykryty i stworzono generatory zawierające oba klucze.

Jednak ta metoda wciąż istnieje jako sposób weryfikacji produktu przez użytkowników niemających połączenia z Internetem. Idąc dalej, łatwo jest zobaczyć, w jaki sposób metody te zostaną wyeliminowane, ponieważ dostęp do Internetu staje się wszechobecny.

Sean
źródło
1

Wszystkie algorytmy ochrony przed kopiowaniem tylko na dyskach CD są niewygodne dla uczciwych użytkowników, a jednocześnie nie zapewniają żadnej ochrony przed piractwem.

„Pirat” musi mieć dostęp tylko do jednej legalnej płyty CD i jej kodu dostępu, a następnie może wykonać n kopii i rozpowszechnić je.

Nie ma znaczenia, w jaki sposób kryptograficznie bezpieczny jest kod, należy go dostarczyć na płycie CD w postaci zwykłego tekstu lub prawowity użytkownik nie może aktywować oprogramowania.

Najbardziej bezpieczne schematy polegają na tym, że użytkownik przekazuje dostawcy oprogramowania niektóre szczegóły maszyny, która uruchomi oprogramowanie (numery seryjne procesora, adresy mac, adres IP itp.), Lub wymaga dostępu online, aby zarejestrować oprogramowanie na stronie internetowej dostawcy i w zamian otrzymasz token aktywacyjny. Pierwsza opcja wymaga dużo ręcznego administrowania i jest warta tylko w przypadku oprogramowania o bardzo wysokiej wartości, druga opcja może zostać sfałszowana i jest absolutnie irytująca, jeśli masz ograniczony dostęp do sieci lub utkniesz za zaporą ogniową.

Ogólnie rzecz biorąc, znacznie łatwiej jest ustanowić relacje zaufania z klientami!

James Anderson
źródło
0

Możesz używać i implementować API Secure Licensing API z ( https://www.nuget.org/packages/SystemSoulLicense/ ) bardzo łatwo w swoich projektach oprogramowania, używając go (musisz pobrać aplikację komputerową do tworzenia bezpiecznej licencji z https: / /www.systemsoulsoftwares.com/ ) 1. Tworzy unikalny UID dla oprogramowania klienckiego w oparciu o sprzęt systemowy (procesor, płyta główna, dysk twardy) (UID działa jako klucz prywatny dla tego unikalnego systemu) 2. Pozwala bardzo łatwo wysyłać zaszyfrowany ciąg licencji do systemu klienta, weryfikuje ciąg licencji i działa tylko na tym konkretnym systemie 3. Ta metoda pozwala twórcom oprogramowania lub firmie przechowywać więcej informacji o oprogramowaniu / programistach / usługach dystrybutorów / funkcjach / kliencie 4. Daje kontrolę nad blokowaniem i odblokowywaniem funkcji oprogramowania klienckiego, oszczędzając czas programistów na tworzenie większej wersji dla tego samego oprogramowania ze zmieniającymi się funkcjami 5. Dbanie o wersję próbną trwa również przez dowolną liczbę dni 6. Zabezpiecza oś czasu Licencji, sprawdzając DateTime online podczas rejestracji 7. Odblokowuje wszystkie informacje o sprzęcie dla programistów 8.Ma wszystkie funkcje przed kompilacją i niestandardowe, do których programista może uzyskać dostęp na każdym etapie licencjonowania, aby tworzyć bardziej złożony bezpieczny kod

Prashant Manjule
źródło