Wygenerowanie unikalnego identyfikatora dla komputera.

0

Chciałbym napisać program który wygeneruje mi unikalny dla każdego komputera na świecie. Może to być

  • ciąg liter
  • ciąg cyfr (liczba)
  • ciąg cyfr i liter
  • ciąg bitów
    Cokolwiek.
    Chodzi o to że jeżeli uruchomię program u siebie na komputerze, to chcę mieć 100% pewność że identyfikator wygenerowany na nim będzie różny od identyfikatora wygenerowanego na np szkolnym komputerze lub laptopie.

Chciałem zrobić coś takiego

  string mac;
  string hostname;
  string os_ver;

  mac      = wygeneruj_mac_karty();     //  <<
  hostname = get_host_name_bla_bla();   //  <<  funkcje które sam napisze
  os_ver   = get_os_version();          //  <<

  return sha1(mac + hostname + os_ver);

Ale nie jestem pewien czy to dobry sposób.

0

Najpierw musisz zdefiniować co to jest dla Ciebie ten "unikalny komputer". Jeżeli weźmiesz identyfikator każdego podzespołu, to np. zmiana dysku spowoduje, że uznasz, że komputer jest inny. Ale to nie brzmi zbyt dobrze, nie? Moim zdaniem powinieneś w pierwszej kolejności popatrzeć na identyfikator płyty głównej (no i jakieś inne informacje o niej - kombinacja UUID z nazwą chyba będzie unikalna), to chyba najrzadziej zmieniany element (no chyba, że wydarzyła się awaria).

Btw: dużo "chyba". ;-)

0

MAC karty jest łatwy do zmiany, co jeśli jest kilka kart? Hostname można zmienić w GUI, wersję systemu każdy powinien regularnie podnosić robiąc aktualizację. Fail.

Już lepiej pociągnąć jakieś info o płycie głównej, module BIOS, karcie graficznej, cokolwiek dostępnego znajdziesz dotyczącego sprzętu. Osobno możesz sobie spisać informacje o systemie i niczego najlepiej nie hashuj. Wrzuć sobie to do base64, w razie gdyby coś się nieznacznie zmieniało na tym samym setupie - dojdziesz samodzielnie o jaki parametr chodzi.

0

Dobrze, to w takim razie może nakierujesz mnie na jakieś rozwiązanie. Chciałbym żeby program działał na jakimś komputerze tylko jeżeli poda mu się jakieś hasło. Chciałbym też żeby na innym użytkownik musiał już wpisać inne.

Rozwiązałem to w taki sposób że generuję sobie taki unikalny identyfikator dla każdego komputera, jego użytkownik musiałby ten identyfikator wysłać mi, ja go sobie jakoś przerobię (np jakimś sprytnym zmienianiem liter i hashowaniem, whatever), co program potem powtórzy, i jeżeli wyniki będą takie same - program się nie wyłączy.

Wiem że to nie powstrzyma jakiegoś crackera albo kogoś takiego, ale na grono użytkowników docelowych programu - wystarczy.

0

Spójrz na ten prosty kod w C#, wykorzystujący WMI do wygenerowania sprzętowego identyfikatora

http://www.secnews.pl/2011/11/26/sprzetowy-identyfikator-w-c-sharp/

1
Bartosz Wójcik napisał(a):

Spójrz na ten prosty kod w C#, wykorzystujący WMI do wygenerowania sprzętowego identyfikatora

http://www.secnews.pl/2011/11/26/sprzetowy-identyfikator-w-c-sharp/

Bardzo słabe rozwiązanie. Pola ProcessorId (de facto CPUID), Caption oraz Manufacturer będą na ogół identyczne dla tych samych modeli procesora. Caption z Win32_BIOS natomiast da taką samą wartość dla naprawdę dużej ilości płyt głównych i to różnych producentów. U mnie to "Award Modular BIOS v6.00PG".

3

Dyskutując o głównym problemie postawionym w wątku odpisujemy w postach, a nie w komentarzach.

Ale te 4 rzeczy na raz już dają ciekawy wynik.

Trzy pierwsze oznaczają w gruncie rzeczy tylko model procesora, a czwarta jest mniej unikalna niż twoje imię.

Do wszystkiego można podejść z innej strony. Nie patrzmy na problem jako wygenerowanie unikalnego identyfikatora (bo to jest tylko środkiem do celu i jednym z możliwych rozwiązań), a na samo porównanie konfiguracji sprzętowej. Nie musimy wcale generować ani bardzo czułego kodu (bo najmniejsza zmiana konfiguracji spowoduje złość klienta opisanego powyżej), ani odpornego na większość zmian, ale bardzo mało unikalnego.
Możemy skorzystać z wielu źródeł entropii, by zwiększyć unikalność i użyć odpowiednio dostrojonej heurystyki przy porównywaniu i pozwolić na pewne zmiany bądź nieścisłości w konfiguracji.
Przykładowo, możemy jako część ze źródeł wybrać model procesora oraz płyty głównej, numer seryjny systemowego dysku twardego, identyfikator instalacji systemu operacyjnego, adres mac karty sieciowej. Pozwalając na pewne różnice klient będzie mógł jednego tygodnia wymienić dysk i przeinstalować system operacyjny i jeżeli w tym momencie będziemy mieli możliwość wygenerowania i zapisania nowego klucza (w przypadku wspomnianych wcześniej statycznych kluczy licencyjnych: nie za bardzo, ale zamieniając ją na aktywną aktywację już tak), drugiego tygodnia wymienić płytę główną z procesorem, a trzeciego zmienić adres mac.
Oczywiście w rzeczywistości źródeł będzie więcej oraz jak wcześniej napisałem, heurystyka będzie odpowiedniego dopasowana do naszego konkretnego przypadku oraz wymagań: nie wszystkie źródła musimy traktować na równi bądź możemy wziąć pod uwagę, że niektóre komponenty klient może wymienić w pewnych grupach.

0

Co do tej unikalnosci to nie musi to byc jakos wielce unikalne bo przeciez osoba ktora nie bedzie miala licencji na twoj program nie bedzie sprawdzala x kluczy od innych ludzi tym bardziej, ze jak ktos kupi to przewaznie nie da a jak juz da to np. jednej osobie bedzie to dzialalo bo nie beda unikalne.

0

Ja bym wyciągał uuid płyty głównej z dmi, np u mnie:

System Information
        Manufacturer: Gigabyte Technology Co., Ltd.
        Product Name: M52S-S3P
        Version:  
        Serial Number:  
        UUID: 30303141-3444-3935-4431-39434D95D19C
        Wake-up Type: Power Switch
        SKU Number:  
        Family:  

Handle 0x0027, DMI type 32, 11 bytes
System Boot Information
        Status: No errors detected

A w laptopie:

System Information
        Manufacturer: eMachines 
        Product Name: E520            
        Version: V1.04
        Serial Number: LXN050C0088380EADF1601
        UUID: 0703B233-7541-E74B-036C-001EECC768E3
        Wake-up Type: Power Switch
        SKU Number: Montevina_Fab
        Family: Intel_Mobile

Handle 0x000E, DMI type 12, 5 bytes
System Configuration Options
        Option 1: J1D4:1-2,5-6,9-10Default;2-3CMOS clr,6-7Pswd clr,10-11Recovery

Handle 0x0012, DMI type 32, 20 bytes
System Boot Information
        Status: No errors detected

UUID powinien być unikalny dla każdej płyty głównej. Nowa płyta główna = nowy komputer, ja przynajmniej tak do tego podchodzę. Reszta może sie zmieniać.

0

Mowisz ze bierzesz cos od uzytkownikow twojego softu i przerabiasz jakos i robisz costam. A co jesli bys pokazal userowi w jaki sposob ma sobie wygenerowac np. klucz prywatny / publiczny, i podeslal by ci klucz publiczny, i ty bys tak zbudowal aplikacje ze dzialalaby tylko i wylacznie jak by w jej katalogu byl klucz prywatny (ktory user tam skopiiuje)? Moze to troche zbyt duzo wymagan od usera (nie wiem jaka jest grupa docelowa)? Ewentualnie, moze sam bedziesz im generowal takie klucze, i podsylal prywatny razem z aplikacja (zmodyfikowana tak aby uzywala klucza prywatnego) - user nie musi wiele robic.
Plusy: masz bardzo bardzo badzo wysokie prawdopodobienstwo unikalnych kluczy (tak wysokie ze przy kluczach np. 2048 DSA jak dostaniesz 2 razy to samo lub uda ci sie przeprowadzic atak na klucz prywatny za pomoca innego klucza publicznego to dostaniesz chyba nobla ;d), bardzo bardzo bardzo ciezko bedzie komus wziac aplikacje i uzyc ja z innym kluczem (jak sie uda to pewnie wtedy ten ktos dostanie nobla), dodatkowo mozesz uzyc takiego czegos do wlasnego classloadera ktory np. wczytuje zaszyfrowane kluczem publicznym klasy i przed defineClass odszyfrowuje byte[] za pomoca prywatnego (moze nie wszystkie klasy, bo to moze spowolnic appsa, ale jakies kilka strategicznych?).
Minus jest taki, ze jak ktos da aplikacje komus innemu razem z kluczem to aplikacja po prostu zadziala i juz. Nie mam jakiegos lepszego pomyslu jak temu zaradzic, wielu juz sie glowilo i ruskie zawsze sobie poradza... Tak samo jak 10 osob zrobi zrzute na twoja aplikacje i powiela 10 razy. Ale jesli np. jest to aplikacja ktora sie laczy z jakims twoim serwerem to moze mozesz zbierac jakies staty i jesli np. cos sie za czesto zmienia to cos z tym zrobic (np. co chwila jakies inne kompy itp. itd.) Zauwaz tez ze dwukrotne rownoczesne uruchomienie aplikacji wcale nie musi oznaczac przekretu, nawet jak wymuszasz tylko 1 instancje (da sie np. w jnlp) - jesli aplikacja zmarla i user uruchomil ja jeszcze raz to moze byc pokazana jak 2 instancja.
Ot, takie luzne mysli na wieczor...

0

Chciałbym uzyskać taki efekt że osoby mogą używać programu, tylko jeżeli dostaną klucz ode mnie. Ale jeżeli dostaną taki klucz od innego użytkownika, to żeby nie działał. Uzyskałem taki efekt przez:

  • daję użytkownikowi sub-program który wyciąga informacje o procku i hashuje - ten kod user wysyła mi.
  • Ja swoim innym sub-programem robię czary mary z kodem i odsyłam zmieniony kod.
  • Program odczytuje te same informacje o procku i hashuje, następnie wykonuje te same instrukcje które ja zrobiłem i jeżeli kod wynikowy i podany jest taki sam, to program się łaskawie nie wyłącza.

Wiem że ten sposób jest mało odporny na crackerów, bo wystarczy minimalna wiedza o programie i całe zabezpieczenie weźmie w łeb. Grupa docelowa to ~ 20-30 dorosłych ludzi mających mała styczność z programowaniem i tego typu rzeczami.

0

Skorzystaj z RSA, nie będzie się dało zrobić keygena. Wprowadzisz konieczność patchowania programu dla chcących używać pirata, a to może być bardzo uciążliwe jeśli się postarasz.

0

Napisz vmke, ktora bedzie realizowala cale zabezpieczenie, tzn. w "jezyku" rozumianym przez ta vm napisz cale zabezpieczenie. Jeszcze lepiej mozesz napisac generator vmek i niezly stos ich zrobic. Podejrzewam, ze nikomu nie bedzie sie chcialo tego w zaden sposob lamac.

1 użytkowników online, w tym zalogowanych: 0, gości: 1