Czego używasz do łączenia / szyfrowania danych?

14

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ą.

David McGraw
źródło
Dobre pytanie, chociaż nie wierzę, że istnieje sposób, aby go w 100% zabezpieczyć, ale wierzę, że istnieje zgrabny sposób zagęszczania i zaciemniania go i chciałbym dowiedzieć się więcej na ten temat ...
Prix
Warto zastanowić się, czy Twoje zasoby graficzne / audio należy nawet uznać za „wrażliwe”. Wiele gier celowo udostępnia swoje zasoby graczom, aby wspierać zdrową społeczność modów, co z kolei może wnieść dodatkową wartość do gry (nawet praktycznie bez kosztów dla dewelopera).
Ian Schreiber
Zajmuję się głównie wrażliwymi danymi, które napędzają grę opartą na danych (na przykład pliki XML). Właśnie widziałem, jak gry łączą wszystko w jeden lub dwa pliki.
David McGraw,
4
Co jest złego w tym, że gracze bawią się tymi danymi?
jsimmons,
pokonać własny bęben .. CFL: iki.fi/sol/cfl
Jari Komppa

Odpowiedzi:

8

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.

voodooattack
źródło
+1 za to. Kompresja zaspokaja zarówno potrzebę zaciemnienia, jak i poprawi czas ładowania i ślad aplikacji. Archiwum / pakowanie danych i tak będzie wymagało warstwy abstrakcji, więc połączenie jej z czymś, co może załadować / rozpakować w miejscu, nie powinno być zbyt dużym wysiłkiem inżynieryjnym. Jeśli zdecydujesz się na kompresję, upewnij się, że logika kompresji / dekompresji będzie oddzielona od ładowania / archiwizacji. W ten sposób możesz później zmienić lepszy algorytm, potrzebna infrastruktura nie zmienia się między algorytmami.
MrCranky
@MrCranky: Jeśli spojrzysz na sposób, w jaki robi to EA w formacie archiwum .package (DBPF) (używanym w grach SPORE i The Sims), zobaczysz to w akcji. Ich silnik ma dodatkowe pole w tabeli indeksu dla „typu kompresji”, wewnętrznego kodu używanego algorytmu. Używają różnych algorytmów kompresji w zależności od typu fragmentu (fragmenty tekstu używają na przykład specjalnej kompresji). Stosowany przez nich system kontroli wersji umożliwia także integrację modów i kompatybilność wsteczną. Więcej na temat formatu DBPF tutaj: simswiki.info/DatabasePackedFile
voodooattack
Ciekawe rzeczy: robiłem to tylko w czasie kompilacji z #define, ale środowisko wykonawcze otwiera kilka fajnych możliwości (takich jak możliwość zmiany rodzaju kompresji bez konieczności przebudowywania każdego pliku dla gry).
MrCranky,
11

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.

  1. Zapnij to
  2. xor plik
  3. zmień rozszerzenie na coś nudnego (tj. nie my_level.zip.xorużywaj my_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.

deft_code
źródło
Właśnie to zazwyczaj widzę w większości gier ... ciasteczka dla ciebie.
Prix
2
Naprawdę wystarczy zip + zmiana nazwy.
coderanger
1
nie sądzę, podoba mi 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ę ...
Prix
1
Wiedz jak, tak. Nigdy się nie przejmuję, nie.
coderanger
zip + zmiana nazwy to za mało. Linux rzadko używa rozszerzeń plików, aby określić typ pliku. Zamiast tego patrzy na kilka pierwszych bajtów i używa go do określenia swojego typu. Zip o zmienionej nazwie nadal pojawia się w systemie Linux jako zip. Windows XP tego nie robi, nadal używa rozszerzeń. Nie wiem, jak to robi Windows7, ale spodziewam się, że w przyszłości Windows użyje podobnej techniki.
deft_code
4

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).

koderanger
źródło
4

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.

Jake McArthur
źródło
1
To jest cel. Absolutnie nie mam ochoty walczyć z hakerami.
David McGraw,
1

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

zebrabox
źródło
1

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
Dzięki za link, nigdy nie myślałem, żeby przyjrzeć się bliżej szczegółom MPQ (i ogólnie zakładałem, że będą niedostępne)
Bill
Jeśli jest tak bezpieczny, dlaczego został do tego stopnia poddany inżynierii wstecznej, a nawet może współpracować z bibliotekami stron trzecich? ;-)
coderanger
Większość narzędzi (czytaj: wszystkie) do interakcji z plikami * .mpq zależy od Stormlib, który jest napisany i obsługiwany przez jednego faceta.
O ile mi wiadomo, Stormlib wymaga posiadania oryginalnej gry, z której pochodzi archiwum, ponieważ klucze do deszyfrowania są przechowywane w pliku wykonywalnym. Jednak największym powodem, dla którego jest tak bezpieczny, nie jest to, że nie można się włamać. Ale w przypadku danych w locie przesyłanych przez sieć nie ma sobie równych. Dane są tak mocno zaszyfrowane, że bezużyteczne byłoby odszyfrowanie w trybie offline przez osobę trzecią.
W rzeczywistości w „World of Warcraft” Blizzard jest pionierem technologii przesyłania strumieniowego, umożliwiając grę z zaledwie kilkoma procentami wszystkich danych pobranych na dysk twardy. Format * .mpq wyróżnia się w tego rodzaju zadaniach. Nie wspominając już o tym, że kiedy instalator Starcraft 2 został wydany przez Blizzarda kilka dni przed oficjalnym wydaniem gry, jego archiwa były tak mocno zaszyfrowane, że nie można było ich otworzyć przed wydaniem gry. : P
0

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 .

Roger Perkins
źródło