Come posso proteggere i miei dati di salvataggio dall'hacking casuale?


32

Quali sono le opzioni per salvare i dati di gioco in modo sicuro? Sono interessato a soluzioni su misura per C ++.

Sto cercando qualcosa che sia veloce e facile da usare. Sono solo preoccupato per la memorizzazione di informazioni semplici come

  • Quali livelli sono e non sono sbloccati

  • Il punteggio dell'utente per ogni livello

Sono di nuovo curioso di sapere cosa c'è là fuori da usare, tutte le buone librerie da usare che mi danno file di dati di gioco piacevoli e sicuri con cui il giocatore medio non può scherzare.

Ho appena trovato questo qui che sembra molto bello, ma sarebbe bello avere alcune opinioni su potenziali altre librerie / opzioni là fuori.


5
Perché hai bisogno della sicurezza? Se un giocatore vuole imbrogliare per sbloccare un livello modificando il salvataggio perché si è bloccato perché non lasciarlo fare?
Adam,

2
bene, il gioco si spera su IndieCity.com, hanno un proprio sistema di risultati da usare. Voglio basare solo alcuni risultati sulla sconfitta di determinati livelli contenenti boss. Non è permesso avere il giocatore in grado di imbrogliare per sbloccare questi obiettivi. È contro le regole della "PAC" come vengono chiamate. Quindi ho bisogno di avere una qualche forma di misura di sicurezza, niente di speciale ma solo per impedire al giocatore occasionale di alterare i dati
dan369,

1
Potrebbe valere la pena dire a IndieCity.com che ci sono limiti a tale requisito, poiché è impossibile per te proteggere un gioco di salvataggio a meno che il gioco di salvataggio non rimanga sul tuo server.
Kylotan,

Risposte:


24

prima diciamo che, dato che hai un file di salvataggio molto semplice, puoi usare un file di testo.

una delle idee più semplici è quella di utilizzare una chiave di stringa per bloccare / sbloccare i dati:

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

ma dopo una piccola ricerca su Google ho trovato questi link, che potrebbero essere utili:

Modificare:

Basandomi sul fatto che il carattere firmato è "Comportamento indefinito", come menzionato da @ v.oddou, suppongo che l'uso di XOR o il cast su caratteri non firmati genererà un codice più sicuro / multipiattaforma. qualcosa come questo:

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

questo sembra un bel metodo :), quanto basta per i miei scopi. Sono curioso di porre qui un'altra domanda, in termini di "chiave", qual è una chiave accettabile? Posso passare qualcosa, ad esempio una lunga stringa?
dan369,

E sai, penso che andrò con questo, è esattamente quello che volevo. Semplice e facile da usare, e niente di troppo elegante :).
dan369,

2
@Danran sì, ogni cosa è accettabile per la chiave, può essere una stringa di un carattere che si tradurrà in qualcosa di simile al codice di Cesare o in qualsiasi altra frase con qualsiasi altra lunghezza che ti piace. puoi anche usare qualche altro algoritmo per rimescolare le posizioni dei dati, ad es. scambiare valori in posizioni pari e dispari.
Ali1S232,

Ti suggerisco di utilizzare XORinvece di incremento / decremento, in quanto potresti finire con dati corrotti se superi i limiti del tipo di dati con cui hai a che fare ( charpresumo)
bummzack,

2
Non importa, o usi xor, o incrementa / decrementa, recupera i dati. notare che se si incrementa il tracimazione dei generi, anche il decreament successivo genererà un underflow.
Ali1S232,

24

Nulla può essere considerato lato client sicuro; chiunque ti dica che lo è, sta mentendo.

È possibile utilizzare qualsiasi metodo di crittografia e scramble desiderato, ma poiché il client deve essere anche in grado di decodificarlo e l'utente ha accesso al client stesso, se è abbastanza intraprendente avrà accesso alla chiave / algoritmo di decrittazione.

Si può solo aggiungere strati di fastidi per qualcuno disposto a rompere, ma dato abbastanza tempo esso sarà essere incrinato , e non si può far nulla.


26
Mentre quello che stai dicendo è vero, penso che l'autore sia consapevole del fatto che un determinato hacker potrebbe ancora riuscirci, dal momento che ha esplicitamente chiesto un modo per prevenire "l'hacking casuale". : - \
loneboat

2
Esatto, ben consapevole che un hacker, se determinato, potrebbe facilmente accedere ai miei dati di gioco. Non volevo che l'utente medio / occasionale fosse in grado di aprire semplicemente i file e iniziare a modificarli.
dan369

@Danran: bene, non mi piace molto ma immagino abbia senso in alcuni contesti. Non sto eliminando la risposta perché penso sia importante segnalarlo alle persone che lo leggono.
o0 '.

2
Inoltre, se si ritiene che valga la pena hackerare qualcuno probabilmente lo farà in modo che l'hacking sia possibile da parte dell'utente occasionale. Ci sono interi forum dedicati a questo.
Jesse Dorsey

@Noctrine: una reazione attiva può aiutare in questo caso. tieni presente la community intorno al tuo gioco, quando uno strumento di crack è disponibile all'aperto, modifica la tecnica di crittografia e rilascia una patch. questa patch può essere resa obbligatoria se il gioco ha un componente online. ovviamente a nessun giocatore (e certamente non a me) piace essere obbligato ad aggiornare le cose in primo luogo, né mi piace avere bisogno di essere collegato. (EA male, simcity boo ...)
v.oddou

10

Puoi sicuramente lasciare il tuo file di salvataggio non crittografato ma aggiungere un checksum che viene calcolato attraverso tutti i valori che vuoi "proteggere".

Il cracker sarebbe quindi in grado di ri-produrre l'hashish (che ovviamente userete con sale adeguato) e quindi si divertirà un mondo a provare a ri-produrre.

Questo non sarebbe ancora sicuro al 100% ma, probabilmente, la migliore soluzione efficace in termini di tempo.


2

Ciò ha fornito una semplice crittografia 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;
}

E come usarlo:

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

L'output di questo codice è questo:

Encrypted: :=.43*-:8m2$.
Decrypted:kylewbanks.com

0

Ecco alcuni programmi (comunque gratuiti) che potrebbero aiutarti, entrambi fondamentalmente combinano tutte le tue risorse in un unico exe.

  • NBinder , ora un prodotto commerciale, questa è una versione vecchia ma funzionale.

  • Enigma Virtual Box , un altro strumento con caratteristiche simili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.