Bagaimana saya bisa melindungi data simpanan saya dari peretasan biasa?


32

Opsi apa yang ada untuk menyimpan data game dengan cara yang aman? Saya tertarik pada solusi yang khusus dirancang untuk C ++.

Saya mencari sesuatu yang cepat dan mudah digunakan. Saya hanya khawatir tentang menyimpan informasi sederhana seperti

  • Level mana yang sedang dan tidak terbuka

  • Skor pengguna untuk setiap level

Saya ingin tahu lagi untuk mengetahui apa yang ada di luar sana untuk digunakan, setiap perpustakaan yang baik untuk digunakan yang memberi saya file data game yang bagus dan aman yang tidak bisa dipusingkan oleh pemain biasa.

Saya baru saja menemukan ini di sini yang terlihat sangat bagus, tetapi akan sangat bagus untuk mendapatkan beberapa pendapat tentang potensi perpustakaan / opsi lain di luar sana.


5
Mengapa Anda membutuhkan keamanan? Jika seorang pemain ingin menipu untuk membuka kunci level dengan mengedit save karena mereka macet mengapa tidak membiarkan mereka melakukannya?
Adam

2
nah, gamenya diharapkan akan naik di IndieCity.com, mereka memiliki sistem prestasi sendiri untuk digunakan. Saya ingin mendasarkan hanya beberapa prestasi mengalahkan mengalahkan level tertentu yang mengandung bos. Agar pemain dapat menipu cara membuka kunci prestasi ini tidak diperbolehkan. Ini bertentangan dengan aturan "CAP" sebagaimana mereka dipanggil. Jadi saya perlu memiliki beberapa bentuk tindakan pengamanan di tempat, tidak ada yang mewah tetapi hanya untuk menghentikan pemain biasa dari mengubah data
dan369

1
Mungkin patut memberi tahu IndieCity.com bahwa ada batasan untuk persyaratan itu, karena tidak mungkin bagi Anda untuk mengamankan permainan kecuali jika permainan menyimpan tetap di server Anda sendiri.
Kylotan

Jawaban:


24

pertama katakanlah karena Anda memiliki file simpan yang sangat sederhana, Anda dapat menggunakan file teks.

salah satu ide paling sederhana adalah menggunakan kunci string untuk mengunci / membuka kunci data:

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

tetapi setelah sedikit pencarian google, saya menemukan tautan ini, yang mungkin berguna:

Edit:

Berdasarkan karakter yang ditandatangani sebagai "Perilaku tidak terdefinisi" seperti yang disebutkan oleh @ v.oddou, saya rasa menggunakan XOR atau casting ke karakter yang tidak ditandatangani akan menghasilkan kode platform yang lebih aman / lebih lintas platform. sesuatu seperti ini:

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

ini sepertinya metode kecil yang menyenangkan :), cukup untuk tujuan saya. Saya penasaran ingin mengajukan pertanyaan lebih lanjut di sini, dalam hal "kunci", apa kunci yang dapat diterima? Bisakah saya melewati sesuatu yaitu string panjang?
dan369

Dan Anda tahu, saya pikir saya hanya akan pergi dengan ini, itu persis apa yang saya inginkan. Sederhana dan mudah digunakan, dan tidak ada yang terlalu mewah :).
dan369

2
@Ranran ya setiap hal dapat diterima untuk kunci, itu bisa menjadi string satu char yang akan menghasilkan sesuatu seperti Caesar cipher atau frasa lain dengan panjang yang Anda suka. Anda juga dapat menggunakan beberapa algoritma lain untuk mengacak posisi data, misalnya. nilai swap di posisi genap dan ganjil.
Ali1S232

Saya sarankan Anda menggunakan XORalih-alih / mengurangi, karena Anda mungkin berakhir dengan data yang rusak jika Anda melebihi batas tipe data yang Anda hadapi ( charsaya berasumsi)
bummzack

2
Tidak masalah, baik Anda menggunakan xor, atau penambahan / pengurangan, pemulihan data. Perhatikan bahwa jika peningkatan generaees meluap, decreament kemudian juga akan menghasilkan underflow.
Ali1S232

24

Tidak ada yang dapat dianggap aman dari sisi klien; siapa pun yang memberi tahu Anda itu, berbohong.

Anda dapat menggunakan metode enkripsi dan pengacakan apa pun yang Anda inginkan, tetapi karena klien juga harus dapat memecahkan kode itu, dan pengguna memiliki akses ke klien itu sendiri, jika ia cukup akal ia akan memiliki akses ke kunci / algoritma dekripsi.

Anda hanya dapat menambahkan lapisan gangguan kepada seseorang bersedia untuk memecahkannya, tapi diberikan cukup waktu itu akan retak , dan Anda tidak dapat melakukan apa-apa tentang itu.


26
Sementara apa yang Anda katakan itu benar, saya pikir penulis sadar bahwa peretas yang gigih mungkin masih bisa melakukannya, karena ia secara eksplisit meminta cara untuk mencegah "peretasan biasa". : - \
loneboat

2
Tepatnya, sangat disadari bahwa seorang peretas jika ditentukan bisa dengan mudah mengakses data permainan saya. Saya hanya tidak ingin rata-rata / pengguna biasa hanya dapat dengan mudah membuka file dan mulai mengeditnya.
dan369

@Ranran: baik, saya tidak begitu suka tapi saya rasa itu masuk akal dalam beberapa konteks. Saya tidak menghapus jawaban karena saya pikir penting untuk menunjukkan ini kepada orang yang membaca ini.
o0 '.

2
Juga, jika dianggap layak meretas seseorang kemungkinan akan membuatnya sehingga peretasan itu dimungkinkan oleh pengguna biasa. Ada seluruh forum yang didedikasikan untuk hal itu.
Jesse Dorsey

@Noctrine: reaksi aktif dapat membantu dalam kasus ini. tetap waspada terhadap komunitas di sekitar game Anda, ketika beberapa alat crack terbuka, ubah teknik enkripsi dan lepaskan tambalan. tambalan ini dapat dibuat wajib jika game memiliki komponen online. tentu saja tidak ada pemain (dan tentu saja bukan saya) yang suka dipaksa untuk memperbarui barang sama sekali di tempat pertama, saya juga tidak perlu terhubung. (EA evil, simcity boo ...)
v.oddou

10

Anda pasti dapat membiarkan file save tidak terenkripsi tetapi menambahkan checksum yang dihitung melalui semua nilai yang ingin Anda "jaga".

Karena itu cracker akan dapat memproduksi kembali hashing (yang tentunya akan Anda gunakan dengan garam yang tepat) dan karenanya akan bersenang-senang mencoba memproduksi kembali.

Ini masih belum menjadi 100% aman tetapi, mungkin solusi efektif waktu terbaik.


2

Ini memberikan beberapa enkripsi XOR sederhana:

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

Dan bagaimana cara menggunakannya:

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

Output dari kode ini adalah ini:

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

0

Berikut adalah beberapa program (yang gratis pula) yang dapat membantu Anda, keduanya pada dasarnya menggabungkan semua sumber daya Anda menjadi satu exe.

  • NBinder , sekarang merupakan produk komersial, ini adalah versi lama namun fungsional.

  • Enigma Virtual Box , alat lain dengan fitur serupa.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.