Wie kann ich meine gespeicherten Daten vor gelegentlichem Hacking schützen?

32

Welche Möglichkeiten gibt es, um Spieldaten sicher zu speichern? Ich interessiere mich für speziell auf C ++ zugeschnittene Lösungen.

Ich suche etwas, das schnell und einfach zu bedienen ist. Ich mache mir nur Sorgen um das Speichern einfacher Informationen wie

  • Welche Ebenen sind und sind nicht freigeschaltet

  • Die Punktzahl des Benutzers für jedes Level

Ich bin wieder neugierig zu wissen, was da draußen zu verwenden ist, und welche guten Bibliotheken mir nette, sichere Spieledatendateien geben, mit denen der durchschnittliche Spieler nicht herumspielen kann.

Ich habe das hier gerade gefunden , was sehr schön aussieht, aber es wäre großartig, wenn ich ein paar Meinungen zu potenziellen anderen Bibliotheken / Optionen da draußen hätte.

dan369
quelle
5
Warum benötigen Sie die Sicherheit? Wenn ein Spieler betrügen möchte, um ein Level durch Bearbeiten des Speichers freizuschalten, weil er feststeckt, warum sollte er es nicht einfach tun lassen?
Adam
2
Nun, das Spiel wird hoffentlich auf IndieCity.com verfügbar sein. Sie haben dort ein eigenes Leistungssystem, das sie verwenden können. Ich möchte nur ein paar Erfolge damit begründen, bestimmte Levels mit Bossen zu besiegen. Es ist nicht erlaubt, dass der Spieler seinen Weg zum Freischalten dieser Erfolge betrügt. Es ist gegen die "GAP" Regeln, wie sie genannt werden. Ich brauche also eine Art Sicherheitsmaßnahme, nichts Besonderes, nur um den Gelegenheitsspieler daran zu hindern, Daten zu ändern
dan369
1
Es kann sinnvoll sein, IndieCity.com mitzuteilen, dass diese Anforderung begrenzt ist, da Sie ein gespeichertes Spiel nur sichern können, wenn das gespeicherte Spiel auf Ihrem eigenen Server gespeichert ist.
Kylotan,

Antworten:

24

Nehmen wir zunächst an, Sie haben eine sehr einfache Speicherdatei und können eine Textdatei verwenden.

Eine der einfachsten Ideen ist die Verwendung eines Zeichenfolgenschlüssels zum Sperren / Entsperren von Daten:

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()];
}

aber nach ein wenig google suche habe ich diese links gefunden, die nützlich sein könnten:

Bearbeiten:

Basierend darauf, dass signiertes Zeichen "Undefiniertes Verhalten" ist, wie von @ v.oddou erwähnt, führt die Verwendung von XOR oder das Umwandeln in nicht signiertes Zeichen zu sichererem / plattformübergreifenderem Code. etwas wie das:

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
quelle
Das scheint eine nette kleine Methode zu sein :), gerade genug für meine Zwecke. Ich bin neugierig, hier eine weitere Frage in Bezug auf einen "Schlüssel" zu stellen, was ist ein akzeptabler Schlüssel? Kann ich irgendetwas weitergeben, zB eine lange Schnur?
Dan369
Und weißt du, ich denke, ich werde einfach mitmachen, es ist genau das was ich wollte. Einfach und leicht zu bedienen und nichts Besonderes :).
Dan369
2
@Danran Ja, alles ist für den Schlüssel akzeptabel. Es kann sich um eine Zeichenfolge handeln, die zu so etwas wie einer Caesar-Chiffre oder einer anderen Phrase mit einer anderen Länge führt. Sie können auch einen anderen Algorithmus verwenden, um Datenpositionen zu verschlüsseln, z. Werte in geraden und ungeraden Positionen tauschen.
Ali1S232
Ich schlage vor, Sie verwenden XORanstelle von Inkrementieren / Dekrementieren, da Sie möglicherweise beschädigte Daten erhalten, wenn Sie die Grenzen des Datentyps überschreiten, mit dem Sie es zu tun haben ( charnehme ich an)
bummzack
2
Es spielt keine Rolle, ob Sie xor verwenden oder Daten wiederherstellen, um sie zu erhöhen oder zu verringern. Beachten Sie, dass bei einem inkrementellen Generaee-Überlauf ein späterer Abbau ebenfalls zu einem Unterlauf führt.
Ali1S232,
24

Nichts kann als sicherer Client betrachtet werden. wer es dir sagt, lügt.

Sie können eine beliebige Verschlüsselungs- und Verschlüsselungsmethode verwenden. Da der Client diese jedoch auch entschlüsseln kann und der Benutzer Zugriff auf den Client selbst hat, kann er auf den Entschlüsselungsschlüssel / -algorithmus zugreifen, wenn er über ausreichende Ressourcen verfügt.

Sie können nur jemandem Ärgernisse zufügen, der bereit ist, sie zu knacken, aber wenn genügend Zeit zur Verfügung steht , wird sie geknackt , und Sie können nichts dagegen tun.

o0 '.
quelle
26
Während das, was Sie sagen, wahr ist, denke ich, dass der Autor sich bewusst ist, dass ein entschlossener Hacker wahrscheinlich immer noch dagegen vorgehen könnte, da er ausdrücklich nach einer Möglichkeit gefragt hat, "gelegentliches Hacken" zu verhindern. : - \
Loneboat
2
Genau, wohlwissend, dass ein Hacker, wenn er das feststellt, leicht auf meine Spieldaten zugreifen kann. Ich wollte nur nicht, dass der durchschnittliche / gelegentliche Benutzer die Dateien einfach öffnen und mit der Bearbeitung beginnen kann.
Dan369
@Danran: Gut, das gefällt mir nicht sehr gut, aber ich denke, es macht in manchen Zusammenhängen Sinn. Ich lösche die Antwort nicht, weil ich es für wichtig halte, die Leser darauf hinzuweisen.
o0 '.
2
Auch wenn es sich lohnt, etwas zu hacken, wird es wahrscheinlich jemand machen, damit der Gelegenheitsnutzer es hacken kann. Dafür gibt es ganze Foren.
Jesse Dorsey
@Noctrine: Eine aktive Reaktion kann in diesem Fall helfen. Achten Sie auf die Community rund um Ihr Spiel, ändern Sie die Verschlüsselungstechnik und veröffentlichen Sie einen Patch, wenn ein Crack-Tool im Umlauf ist. Dieser Patch kann obligatorisch gemacht werden, wenn das Spiel eine Online-Komponente hat. Natürlich möchte kein Spieler (und schon gar nicht ich) gezwungen werden, etwas zu aktualisieren, noch möchte ich verbunden sein. (EA böse, Simcity Boo ...)
v.oddou
10

Sie können Ihre gespeicherte Datei definitiv unverschlüsselt lassen, aber eine Prüfsumme hinzufügen, die anhand aller Werte berechnet wird, die Sie "schützen" möchten.

Der Cracker wäre daher in der Lage, das Hashing (das Sie natürlich mit geeignetem Salz verwenden werden) erneut zu produzieren, und hat daher eine glückliche Zeit, zu versuchen, es erneut zu produzieren.

Dies wäre immer noch nicht 100% sicher, aber wahrscheinlich die beste zeiteffektive Lösung.

Herr
quelle
2

Dies lieferte einige einfache XOR-Verschlüsselung:

#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;
}

Und wie man es benutzt:

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;
}

Die Ausgabe dieses Codes lautet wie folgt:

Encrypted: :=.43*-:8m2$.
Decrypted:kylewbanks.com
Lenard Arquin
quelle
0

Hier sind ein paar Programme (sowieso kostenlose), die Ihnen helfen könnten. Beide kombinieren im Grunde alle Ihre Ressourcen in einer einzigen Exe.

  • NBinder , jetzt ein kommerzielles Produkt, ist eine alte, aber funktionale Version.

  • Enigma Virtual Box , ein weiteres Tool mit ähnlichen Funktionen.

HartnäckigD
quelle