Kaydetme verilerimi geçici bilgisayar korsanlarından nasıl korurum?


32

Oyun verilerini güvenli bir şekilde kaydetmek için hangi seçenekler var? C ++ için özel olarak hazırlanmış çözümlerle ilgileniyorum.

Hızlı ve kullanımı kolay bir şey arıyorum. Sadece gibi basit bilgileri saklama konusunda endişeliyim

  • Hangi seviyeler ve kilidi açılmamış

  • Her seviye için kullanıcının puanı

Orada neyin kullanılacağını, ortalama bir oyuncunun karıştıramayacağı güzel, güvenli oyun veri dosyalarını veren herhangi bir iyi kütüphaneyi kullanmayı tekrar merak ediyorum.

Sadece buldum bu çok güzel görünüyor ki burada, ama orada potansiyel diğer kütüphaneler / seçenekler bazı görüşler almak için çok iyi olurdu.


5
Neden güvenliği istiyorsun? Bir oyuncu parayı düzenleyerek bir seviyenin kilidini açmak için hile yapmak istiyorsa, sıkışıp kaldıklarından neden sadece yapmalarına izin vermiyorsunuz?
Adam

2
Eh, oyun umarım IndieCity.com üzerinde artacak, kullanmak için kendi başarı sistemi var. Patron içeren bazı seviyeleri yenerek sadece birkaç başarıya dayanmak istiyorum. Oyuncunun bu başarıların kilidini açma yolunda hile yapmasını sağlamak yasaktır. Bunun adı "CAP" kurallarına aykırıdır. Bu yüzden bir çeşit güvenlik önlemi almam gerekiyor, sıradan bir oyuncunun verileri değiştirmesini engellemekten başka bir şey değil
dan369

1
IndieCity.com'a bu gereksinimin sınırlarının olduğunu söylemeye değer olabilir, çünkü kaydetme oyunu kendi sunucunuzda kalmadıkça bir kaydetme oyununu korumanız imkansızdır.
Kylotan

Yanıtlar:


24

İlk önce şunu söyleyelim: Çok basit bir kaydetme dosyasına sahip olduğunuzdan, metin dosyasını kullanabilirsiniz.

En basit fikirlerden biri, verileri kilitlemek / kilidini açmak için bir dize anahtarı kullanmaktır:

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

ancak küçük bir google aramasından sonra faydalı olabilecek bu bağlantıları buldum:

Düzenle:

İmzalı karakterin belirtildiği gibi "Tanımsız davranış" olduğu belirtildi. @ V.oddou, sanırım XOR veya imzasız karaktere basmak daha güvenli / daha fazla platformlar arası kodla sonuçlanacak. böyle bir şey:

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

Bu benim için küçük bir yöntem gibi görünüyor :). Burada başka bir soru sormak istiyorum, "anahtar" açısından, kabul edilebilir bir anahtar nedir? Uzun bir dize yani herhangi bir şeyi iletebilir miyim?
dan369

Ve bilirsin, sanırım sadece bununla devam edeceğim, tam istediğim buydu. Basit ve kullanımı kolay ve çok süslü bir şey yok :).
dan369,

2
@Danran evet her şey anahtar için kabul edilebilir, Caesar şifresi veya istediğiniz başka bir uzunlukta herhangi bir ifade ile sonuçlanabilecek bir karakter dizesi olabilir . veri konumlarını karıştırmak için başka bir algoritma da kullanabilirsiniz, örneğin. değerleri eşit ve tek konumlarla değiştirin.
Ali1S232

XORArtırma / azaltma yerine kullanmanızı öneririm , çünkü uğraştığınız veri türünün sınırlarını aşarsanız, bozuk verilerle sonuçlanır ( charsanırım)
bummzack

2
Hiç farketmez, ya xor ya da artırma / azaltma, veri kurtarma kullanır. Generazın artan taşması durumunda, daha sonra yavaşlamanın aynı zamanda taşma olacağına dikkat edin.
Ali1S232

24

Hiçbir şey güvenli müşteri tarafı olarak kabul edilemez; Sana söyleyen biri yalan söylüyor.

İstediğiniz herhangi bir şifreleme ve karıştırma yöntemini kullanabilirsiniz, ancak müşterinin şifresini çözebilmesi gerektiğinden ve kullanıcının şifresini çözebilmesi için yeterli bilgiye sahip olması durumunda, şifre çözme anahtarına / algoritmasına erişebilir.

Sadece onu kırmak için istekli birine can sıkma katmanı sağlar ama yeterli zaman verilmiş olabilir o olacak çatlamış ve bu konuda bir şey yapamaz.


26
Söyledikleriniz doğru olsa da, yazarın kararlı bir bilgisayar korsanının muhtemelen hala elde edebileceğinin farkında olduğunu düşünüyorum, çünkü açıkça “rahat hackleme” yi önlemenin bir yolunu istedi. : - \
loneboat

2
Tam olarak, eğer belirlenirse bir bilgisayar korsanının oyun verilerime kolayca erişebileceğinin farkındayım. Sadece sıradan / sıradan bir kullanıcının sadece dosyaları açmasını ve düzenlemeye başlamasını basitçe istemesini istemedim.
dan369

@Danran: Güzel, bundan pek hoşlanmıyorum ama sanırım bazı durumlarda anlam ifade ediyor. Cevabı silmiyorum çünkü bunu okuyan insanlara bunu göstermenin önemli olduğunu düşünüyorum.
'.

2
Ayrıca, birisini hacklemeye değer sayılırsa, muhtemelen bunu hack yapan kullanıcı tarafından mümkün kılınabilir. Sadece buna adanmış bütün forumlar var.
Jesse Dorsey

@Noctrine: aktif bir reaksiyon bu durumda yardımcı olabilir. Oyundaki topluluktan haberdar olun, açıkta bir çatlak aracı açıkken, şifreleme tekniğini değiştirin ve bir yamayı serbest bırakın. Oyunun çevrimiçi bir bileşeni varsa, bu düzeltme eki zorunlu hale getirilebilir. Tabii ki hiçbir oyuncu (ve kesinlikle ben değil) ilk etapta bir şeyleri güncellemeye zorlanmaktan hoşlanmıyor, ne de bağlanmam gerekmiyor. (EA kötülük,
sadelik

10

Kaydetme dosyanızı kesinlikle şifrelenmemiş halde bırakabilirsiniz ancak "korumak" istediğiniz tüm değerler üzerinden hesaplanan bir sağlama toplamı ekleyebilirsiniz.

Bu nedenle kraker, hastayı (uygun tuzla kullanacağınız) yeniden üretebilecektir ve bunun için yeniden üretmeye çalışmaktan mutluluk duyacaktır.

Bu hala% 100 güvenli olmaz, ancak muhtemelen en iyi zaman etkili çözümdür.


2

Bu, bazı basit XOR şifreleme sağladı:

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

Ve nasıl kullanılacağı:

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

Bu kodun çıktısı şudur:

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

0

İşte size yardımcı olabilecek birkaç program (zaten ücretsiz olanlar), ikisi de temel olarak tüm kaynaklarını tek bir exe'de birleştiriyor.

  • NBinder , şimdi ticari bir ürün, bu eski ama işlevsel bir versiyondur.

  • Enigma Sanal Kutu , benzer özelliklere sahip başka bir araç.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.