Coraz więcej gier idzie drogą opartą na danych, co oznacza, że wokół łatwej manipulacji musi istnieć warstwa bezpieczeństwa. Widziałem to, gdy gry kompletnie łączą swoje zasoby (audio, grafikę, dane) i zastanawiam się, w jaki sposób nimi zarządzają? Czy istnieją aplikacje / biblioteki, które będą się wiązać i pomagać w zarządzaniu zasobami? Jeśli nie, czy istnieją jakieś dobre zasoby, które wskazałbyś do pakowania / rozpakowywania / szyfrowania?
To konkretne pytanie dotyczy C ++, ale byłbym otwarty, aby usłyszeć, jak to jest zarządzane w C # / XNA.
Żeby było jasne - nie zamierzam opracować rozwiązania, które zapobiegnie włamaniu. Na poziomie podstawowym wszyscy manipulujemy zerami i jedynkami. Chcemy jednak, aby 99% osób grających w grę nie modyfikowało po prostu plików XML używanych do budowania świata gry. Widziałem wiele gier łączących wszystkie swoje zasoby razem. Jestem po prostu ciekawa metod, których używają.
źródło
Odpowiedzi:
Dobrą strategią jest stworzenie własnego formatu archiwum od zera i uczynienie go indeksowanym z tabelą wskazującą na fragmenty danych zamiast przechowywania całych plików sekwencyjnych w archiwum, a następnie szyfrowanie tabeli indeksów i kompresowanie każdej części osobno za pomocą LZMA / Bzip2.
Inne podejście polega na wykorzystywaniu tu i tam fragmentów proceduralnych generatorów danych (jeśli chcesz posunąć się tak daleko, możesz nawet uzyskać „parametry” wspomnianych generatorów z serwera on-line jako dodatkowy środek) i odciążając część pracy na GPU możesz także zapobiec zrzutom pamięci i odrobić część utraconej wydajności.
Jednak uważam, że takie techniki generalnie ograniczają wydajność i marnują czas na rozwój, jednocześnie oferując użytkownikowi końcowemu jedynie potencjalne problemy i niepotrzebne błędy.
Niemniej jednak nic nie jest w 100% bezpieczne.
źródło
Nie wysyłaj wrażliwych danych.
Nie ma możliwości wysłania zaszyfrowanych danych, aby tylko gra mogła uzyskać do nich dostęp. Możesz bardzo się postarać, ale szybko wchodzisz w problemy z DRM.
Jeśli chcesz trzymać zasoby gry z dala od wścibskich oczu.
xor
plikmy_level.zip.xor
używajmy_level.map
).To powstrzyma 95% złośliwych użytkowników. Pozostałe 5% dostanie to bez względu na to, co robisz.
Nie musisz tak naprawdę zipować i
xor
. Zamiast tego możesz użyć lzma i użyć AES ze znanym kluczem. Chodzi o to, aby nie poświęcać temu dużo czasu.źródło
That will stop 95% of mischeivieous users.
się to, że się włamałem, choć wierzę, że wciąż są ludzie, którzy to dostaną, doceniłbym, gdyby nie wszyscy i każdy mógł. Obecnie większość 10-letnich dzieci wie, jak otwierać pliki w notatniku i zmieniać jego nazwę ...Wydawanie na to dużej ilości czasu jest prawdopodobnie głupie. Istnieją narzędzia do pobierania tekstur i modelowania danych bezpośrednio z GPU, a dźwięki można łatwo skierować na wirtualne urządzenie loopback. Wszystko, co musi być naprawdę bezpieczne, musi żyć na serwerze i działać tylko poprzez wyzwanie / odpowiedź. Sprawdzanie poprawności danych klienta to inna historia, coś więcej niż Valve's -verify_all. Nadal jest to trudne, ponieważ nie można ufać lokalnemu plikowi wykonywalnemu, aby go egzekwować (lub przynajmniej nie można ufać bardziej niż zaufaniu systemowi anty-cheatowemu do punktów końcowych, co również jest głupim pomysłem).
źródło
Moja praca polega na oprogramowaniu antytamperowym. Znam kogoś, kto jest oldschoolowym crackerem. Łamie gry takie jak oddychanie. Nie możesz powstrzymać ludzi takich jak on. Jeśli Twoja gra jest wystarczająco popularna, wiele pękniętych wersji gry trafi na strony z torrentami zaledwie kilka dni po wydaniu, bez względu na to, co robisz. Moja rada to po prostu zrobić absolutne minimum, aby oderwać się od przeciętnego Joe, który myśli, że może chcieć zadać cios temu inżynierii odwrotnej.
źródło
Dobre pytanie, ale odpowiedź na to pytanie jest daleka od łatwej.
Z mojego doświadczenia z bezpieczeństwem danych musisz pomyśleć o następujących kwestiach:
1) Co zabezpieczasz, od kogo i jaki wpływ ma to, że te dane są niepewne - bezpieczeństwo polega bardziej na ocenie ryzyka niż na systematycznych rozwiązaniach technicznych
2) Zakładam, że twoją platformą jest komputer stacjonarny (np. Windows / OSX), w takim przypadku masz inna przestrzeń problemowa niż zastrzeżony sprzęt, taki jak PS3 / Xenon, który ma własne próby zabezpieczenia na poziomie jądra (czy to prawidłowe rozwiązanie jest otwarte do dyskusji)
3) Szyfrowanie! = bezpieczeństwo. Szyfrowanie gwarantuje tylko, że twoich danych nie można odczytać , nie gwarantuje też, że twoich danych nie można zapisać ani odtworzyć / proxy.
Jeśli Twoje wymagania mają sprawić, że Twoje dane będą odporne na manipulację, musisz pomyśleć o zaszyfrowaniu danych (najlepiej za pomocą SHA-256 lub SHA-512). Aby jednak powtórzyć, zastanów się, dlaczego jest to ważne i co zyskujesz dzięki zwiększeniu bezpieczeństwa system.
Warto również wiedzieć, że dodanie technologii szyfrowania do produktu może mieć konsekwencje prawne z powodu ograniczeń eksportowych (technologia szyfrowania jest klasyfikowana jako technologia ograniczona do broni, w którą wierzy lub nie), dlatego zaleca się korzystanie z bibliotek, które rozwiązały te problemy prawne.
Wreszcie - nigdy, nigdy nie wdrażaj własnej technologii szyfrowania - używaj dobrze znanych, udokumentowanych, zbadanych algorytmów, takich jak AES, Blowfish, RSA itp.
ps Klucz publiczny / prywatny nie jest odpowiedni ani praktyczny do szyfrowania dużych ilości danych, dlatego DRM / PGP itp. używają hybrydowego systemu symetrycznego RSA + , tj. zabezpiecz klucz symetryczny za pomocą RSA, a następnie wykonaj standardowe szyfrowanie symetryczne za pomocą tego klucza
To bardzo duży złożony temat i zdecydowanie nie oddałem go sprawiedliwie
Mam nadzieję, że to pomaga
źródło
Jeśli chcesz mieć przykład formatu, który został zaprojektowany i zbudowany (prawdopodobnie nadinżynieryjnie) za to, że jest mały (kompresowalny), absurdalnie bezpieczny i elastyczny, powinieneś spojrzeć na format MPQ Blizzarda.
http://wiki.devklog.net/index.php?title=The_MoPaQ_Archive_Format
Ogólny układ archiwum jest następujący:
Archiwum Nagłówek Plik danych Dane pliku - pliki specjalne Tabela bloków Tabela bloków Tabela rozszerzonych bloków Silny podpis cyfrowy
Ten format ma WSZYSTKO. Blokowalna, rozszerzona blokowalna tabela, podział danych na sektory (dla łatwego przesyłania strumieniowego), obsługa 7 (!) Algorytmów kompresji (jeśli liczyć kompresję dźwięku), które można dowolnie łączyć, słaba sygnatura cyfrowa, silna sygnatura cyfrowa i tak dalej.
Jeśli kupisz interfejs API od Blizzarda, który zajmuje się architekturą plików, dostaniesz wszystko, czego kiedykolwiek potrzebujesz i wiele więcej.
źródło
Ponieważ ostatnio zostało to wskrzeszone, twoje pytanie (a zatem wszystkie dotychczasowe odpowiedzi) dotyczy tylko ładowania pliku, który jest tak bezpieczny, jak plik wykonywalny, który chce go załadować. Na PC nie ma nic, co byłoby naprawdę bezpieczne (po prostu opóźniasz ludzi), możesz sprawdzić na serwerach, ale nawet to sprawdzenie można usunąć, aby zmodyfikowane pliki exe można było uruchomić bez względu na wszystko. Konsole są nadal „ładnymi” zabezpieczeniami, więc w większości przypadków generuję skrót ważnych plików, a następnie podpisuję skrót kluczem prywatnym, osadzam klucz publiczny w kodzie i weryfikuję bezpieczny skrót względem pliku.
Myślałem, że wrzucę do rozmowy kolejny atak, coś, na co natknąłem się w zeszłym roku, ponieważ nie wysyłam zbyt wiele na PC. Cheat Engine to bardzo schludny mały program, który prawie automatyzuje tworzenie własnych hacków (co oznacza, że każdy może z niego korzystać). Jest dość zaawansowany w tym, co potrafi, wiele hacków / cheatów, które widziałem, jak sprzedają ludzie, są tworzone przez to lub coś bardzo podobnego z tego, co widziałem (wszystkie te z rynku masowego). Przy odrobinie pracy, którą możesz ponownie zabezpieczyć przed takimi rzeczami, wszystko zależy od tego, jak popularna jest ta gra i od tego, czy komuś zależy na tyle, żeby zawracać sobie głowę.
Opps, zapomniałem wspomnieć o dobrej bibliotece do szyfrowania (w C ++) to LibTomCrypt .
źródło