偶然のハッキングから保存データを保護するにはどうすればよいですか?


32

ゲームデータを安全な方法で保存するためのオプションは何ですか?C ++向けに特別に調整されたソリューションに興味があります。

高速で使いやすいものを探しています。私は、次のような簡単な情報を保存することだけを心配しています

  • ロック解除されるレベルとされないレベル

  • 各レベルのユーザーのスコア

使用するものが何なのか、平均的なプレイヤーが台無しにできない、安全で優れたゲームデータファイルを提供する優れたライブラリを使用したいので、もう一度興味があります。

ここでこれを見つけましたがこれは非常に良さそうに見えますが、他の潜在的なライブラリ/オプションについて意見を得るのは素晴らしいことです。


5
なぜセキュリティが必要なのですか?プレイヤーが動けなくなったためにセーブを編集してレベルのロックを解除するためにチートしたい場合、なぜそれをさせないのですか?
アダム

2
まあ、ゲームはIndieCity.comでうまくいけば、使用する独自の達成システムがあります。私は、ボスを含む特定のレベルを倒すことで、わずかな成果のみをベースにしたいと考えています。プレイヤーにこれらの実績のロックを解除する方法をごまかすことは許可されていません。彼らが呼ばれると「CAP」ルールに反します。、所定の位置にセキュリティ対策のいくつかのフォームを持って何も空想が、単にデータを変更することから、カジュアルなプレイヤーを停止する必要がある私は
dan369

1
セーブゲームが自分のサーバーに残っていないとセーブゲームを保護できないため、IndieCity.comにその要件に制限があることを伝える価値があるかもしれません。
キロタン

回答:


24

まず、非常に単純な保存ファイルがあるので、テキストファイルを使用できます。

最も簡単なアイデアの1つは、文字列キーを使用してデータをロック/ロック解除することです。

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

しかし、少しのグーグル検索の後、これらのリンクを見つけました。これは役に立つかもしれません:

編集:

@ v.oddouで述べた「未定義の動作」である符号付き文字に基づいて、XORを使用するか、符号なし文字にキャストすると、より安全でクロスプラットフォームなコードが得られると思います。このようなもの:

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

これはちょっとした素敵な方法のように思えます:)、私の目的にはちょうど十分です。「キー」に関して、ここでさらに質問をしたいのですが、受け入れられるキーは何ですか?長い文字列などを渡すことはできますか?
dan369

そして、あなたは知っています、私はこれで行くつもりだと思います、それはまさに私が望んでいたものです。シンプルで使いやすく、あまり派手なものはありません:)。
dan369

2
@Danranええ、すべてがキーに受け入れられます。1文字の文字列で、Caesar暗号や他の好きな長さのフレーズのようなものになります。他のアルゴリズムを使用してデータ位置をスクランブルすることもできます。偶数と奇数の位置の値を交換します。
Ali1S232

XORインクリメント/デクリメントの代わりに使用することをお勧めします。扱うデータ型の範囲を超えるとデータが破損する可能性があるためです(char推測)
-bummzack

2
xorを使用するか、インクリメント/デクリメントしてデータを回復するかは、実際には重要ではありません。増加するジェネレイがオーバーフローした場合、後でdecreamentもアンダーフローを生成することに注意してください。
Ali1S232

24

安全なクライアント側と見なすことはできません。あなたがそうだと言う人は誰でも嘘をついています。

任意の暗号化およびスクランブル方法を使用できますが、クライアントもそれをデコードできる必要があり、ユーザーはクライアント自体にアクセスできるため、十分なリソースがあれば、復号化キー/アルゴリズムにアクセスできます。

あなたはそれをクラックしたいと思う誰かに迷惑なレイヤーを追加することができますがそれクラックれる十分な時間を与えられ、あなたはそれについて何もすることができません。


26
あなたが言っていることは真実ですが、著者は、「偶然のハッキング」を防ぐ方法を明示的に求めたので、断固としたハッカーはおそらくそれでまだ得ることができると知っていると思います。:-\
ローンボート

2
ハッカーが決心した場合、ゲームデータに簡単にアクセスできることを十分に認識しています。私は、平均的な/カジュアルなユーザーが単純にファイルを開いて編集を開始できるようにしたくありませんでした。
dan369

@Danran:結構です、私はそれはあまり好きではありませんが、いくつかの文脈では意味があると思います。これを読んでいる人にこれを指摘することが重要だと思うので、答えを削除しません。
o0 '。

2
また、ハッキングする価値があると判断された場合、誰かがハッキングする可能性が高いため、通常のユーザーがハッキングできるようになります。まさにそれ専用のフォーラムがあります。
ジェシードーシー

@Noctrine:アクティブな反応がこの場合に役立ちます。クラックツールが公開されているときは、ゲーム周辺のコミュニティに注意してください。暗号化技術を変更し、パッチをリリースしてください。ゲームにオンラインコンポーネントがある場合、このパッチを必須にすることができます。もちろん、そもそも何かを更新することを強制されるのを好むプレイヤーはいません(もちろん私もそうではありません)。(EA悪、シムシティブー...)
v.oddou

10

セーブファイルを暗号化せずに残すことはできますが、「ガード」したいすべての値を通して計算されるチェックサムを追加できます。

したがって、クラッカーはハッシング(もちろん、適切なソルトで使用します)を再生成できます。そのため、再生成を試みるのは楽しい時間です。

これはまだ100%安全ではありませんが、おそらく最高の時間効率的なソリューションです。


2

これにより、いくつかの単純な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;
}

そして、それを使用する方法:

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

このコードの出力は次のとおりです。

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

0

以下にいくつかのプログラム(とにかく無料のプログラム)を示します。どちらも基本的にすべてのリソースを単一のexeに結合します。

  • NBinderは現在は商用製品であり、これは古いが機能的なバージョンです。

  • Enigma Virtual Box、同様の機能を持つ別のツール。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.