Jak mogę chronić moje zapisane dane przed przypadkowym włamaniem?

32

Jakie są opcje bezpiecznego zapisywania danych gry? Interesują mnie rozwiązania specjalnie dostosowane do C ++.

Szukam czegoś, co jest szybkie i łatwe w użyciu. Martwię się tylko o przechowywanie prostych informacji, takich jak

  • Które poziomy są i nie są odblokowane

  • Wynik użytkownika dla każdego poziomu

Znowu jestem ciekawy, jakie są dostępne, wszelkie dobre biblioteki do użycia, które dają mi ładne, bezpieczne pliki danych gry, z którymi przeciętny gracz nie może zepsuć.

Właśnie znalazłem to tutaj, które wygląda bardzo ładnie, ale byłoby wspaniale uzyskać opinie o potencjalnych innych bibliotekach / opcjach.

dan369
źródło
5
Dlaczego potrzebujesz bezpieczeństwa? Jeśli gracz chce oszukiwać, aby odblokować poziom, edytując zapis, ponieważ utknął, dlaczego nie pozwolić mu tego zrobić?
Adam
2
gra ma nadzieję wejść na IndieCity.com, mają do dyspozycji własny system osiągnięć. Chcę oprzeć tylko kilka osiągnięć na pokonaniu pewnych poziomów zawierających bossów. Aby gracz mógł oszukiwać swoją drogę do odblokowania tych osiągnięć, nie jest dozwolone. Jest to sprzeczne z zasadami „WPR”, jak się je nazywa. Muszę więc wprowadzić jakieś środki bezpieczeństwa, nic nadzwyczajnego, tylko po to, żeby powstrzymać zwykłego gracza przed zmianą danych
Dan369
1
Warto może powiedzieć IndieCity.com, że istnieją ograniczenia tego wymogu, ponieważ nie można zabezpieczyć zapisanej gry, chyba że zapisana gra pozostanie na twoim serwerze.
Kylotan,

Odpowiedzi:

24

powiedzmy, że ponieważ masz bardzo prosty plik zapisu, możesz użyć pliku tekstowego.

jednym z najprostszych pomysłów jest użycie klucza do blokowania / odblokowywania danych:

void encrypt(string& data,string key)
{
    for(unsigned i=0;i<data.size();i++)
        data[i] += key[i%key.size()];
}

void decrypt(string& data,string key)
{
    for(unsigned i=0;i<data.size();i++)
        data[i] -= key[i%key.size()];
}

ale po krótkim wyszukiwaniu w Google znalazłem te linki, które mogą być przydatne:

Edytować:

Opierając się na tym, że podpisany znak jest „Nieokreślonym zachowaniem”, jak wspomniał @ v.oddou, myślę, że użycie XOR lub rzutowanie na niepodpisany znak spowoduje, że kod będzie bezpieczniejszy / więcej niż platforma. coś takiego:

void encrypt(string& data,string key)
{
    for(unsigned i=0;i<data.size();i++)
        data[i] ^= key[i%key.size()];
}

void decrypt(string& data,string key)
{
    for(unsigned i=0;i<data.size();i++)
        data[i] ^= key[i%key.size()];
}
Ali1S232
źródło
to wydaje się być fajną małą metodą :), wystarczającą do moich celów. Jestem ciekawy, aby zadać tutaj dodatkowe pytanie dotyczące „klucza”, jaki jest dopuszczalny klucz? Czy mogę przekazać coś, np. Długi sznurek?
dan369
I wiesz, myślę, że po prostu pójdę z tym, właśnie tego chciałem. Prosty i łatwy w użyciu i nic nadzwyczajnego :).
dan369
2
@Danran tak, każda rzecz jest akceptowalna dla klucza, może to być ciąg znaków, który da w wyniku coś w rodzaju szyfru Cezara lub dowolną inną frazę o dowolnej innej długości. możesz także użyć innego algorytmu do szyfrowania pozycji danych, np. Zamień wartości w parzystych i nieparzystych pozycjach.
Ali1S232,
Sugeruję, abyś używał XORzamiast inkrementacji / dekrementacji, ponieważ możesz skończyć z uszkodzonymi danymi, jeśli przekroczysz granice typu danych, z którym masz do czynienia ( charzakładam)
bummzack
2
To naprawdę nie ma znaczenia, albo używasz XOR, albo zwiększasz / zmniejszasz dane, odzyskujesz. zwróć uwagę, że jeśli wzrost przepełnienia generałów, późniejszy spadek spowoduje również niedopełnienie.
Ali1S232,
24

Nic nie można uznać za bezpieczną stronę klienta; każdy, kto ci to mówi, kłamie.

Możesz użyć dowolnej metody szyfrowania i szyfrowania, ale ponieważ klient musi być w stanie ją również zdekodować, a użytkownik ma dostęp do samego klienta, jeśli będzie wystarczająco zaradny, będzie miał dostęp do klucza / algorytmu deszyfrowania.

Możesz tylko dodawać warstwy irytacji komuś, kto chce go złamać, ale mając wystarczająco dużo czasu , zostanie on złamany i nie możesz nic na to poradzić.

o0 ”.
źródło
26
Chociaż to, co mówisz, jest prawdą, myślę, że autor zdaje sobie sprawę, że zdeterminowany haker prawdopodobnie nadal mógłby to zrobić, ponieważ wyraźnie poprosił o sposób zapobiegania „przypadkowemu hakowaniu”. : - \
loneboat
2
Dokładnie, doskonale zdaję sobie sprawę z tego, że haker, jeśli to ustalone, może łatwo uzyskać dostęp do moich danych gry. Po prostu nie chciałem, aby przeciętny / przypadkowy użytkownik mógł po prostu otworzyć pliki i rozpocząć ich edycję.
dan369
@Danran: w porządku, nie bardzo mi się to podoba, ale wydaje mi się, że ma to sens w niektórych kontekstach. Nie usuwam odpowiedzi, ponieważ uważam, że ważne jest, aby zwrócić na to uwagę czytelnikom.
o0 ”.
2
Ponadto, jeśli zostanie uznane za warte włamania, ktoś prawdopodobnie to zrobi, aby hakowanie było możliwe przez zwykłego użytkownika. Istnieją całe fora poświęcone właśnie temu.
Jesse Dorsey
@Ntrtrine: aktywna reakcja może w tym przypadku pomóc. miej świadomość społeczności wokół twojej gry, gdy jakieś narzędzie do łamania zabezpieczeń jest dostępne na zewnątrz, zmień technikę szyfrowania i opublikuj łatkę. ta łatka może być obowiązkowa, jeśli gra ma komponent online. oczywiście żaden gracz (a już na pewno nie ja) nie lubi być zmuszany do aktualizacji rzeczy w ogóle, ani nie chcę być podłączony. (EA zło, simcity boo ...)
w.oddou
10

Możesz zdecydowanie pozostawić plik składowania niezaszyfrowany, ale dodać sumę kontrolną, która jest obliczana na podstawie wszystkich wartości, które chcesz „chronić”.

W ten sposób krakers byłby w stanie odtworzyć skrót (którego oczywiście użyjesz z odpowiednią solą) i dlatego będzie miał szczęśliwy czas na jego ponowne wytworzenie.

To wciąż nie byłoby w 100% bezpieczne, ale prawdopodobnie najlepsze rozwiązanie efektywne czasowo.

Herr
źródło
2

Ten przedstawił pewne proste szyfrowanie XOR:

#include <iostream>

using namespace std;

string encryptDecrypt(string toEncrypt) {
    char key[3] = {'K', 'C', 'Q'}; //Any chars will work
    string output = toEncrypt;

    for (int i = 0; i < toEncrypt.size(); i++)
        output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];

    return output;
}

I jak go używać:

int main(int argc, const char * argv[])
{
    string encrypted = encryptDecrypt("kylewbanks.com");
    cout << "Encrypted:" << encrypted << "\n";

    string decrypted = encryptDecrypt(encrypted);
    cout << "Decrypted:" << decrypted << "\n";

    return 0;
}

Dane wyjściowe tego kodu są następujące:

Encrypted: :=.43*-:8m2$.
Decrypted:kylewbanks.com
Lenard Arquin
źródło
0

Oto kilka programów (w każdym razie darmowych), które mogą ci pomóc, oba w zasadzie łączą wszystkie twoje zasoby w jednym exe.

  • NBinder , obecnie produkt komercyjny, jest to stara, ale funkcjonalna wersja.

  • Enigma Virtual Box , kolejne narzędzie o podobnych funkcjach.

Tenacious D
źródło