2017-08-14 7 views
-3

私は、ユーザーが試合に勝った場合に新しいポイントを追加するために現在のスコアを保存する必要があるゲームを開発しています。 Googleのゲームのサンプルを見て、私はこのコメントが見つかりました:ゲームのスコアを保存するためのAndroid暗号化ファイル

public void saveLocal(Context ctx) { 
     /* TODO: This is left as an exercise. To make it more difficult to cheat, 
     * this data should be stored in an encrypted file! And remember not to 
     * expose your encryption key (obfuscate it by building it from bits and 
     * pieces and/or XORing with another string, for instance). */ 
    } 

彼らは地元の得点でポイントを格納しているが、それらはリーダーボード上の新しいスコアをアップロードするには、このローカル変数にポイントを追加します。

この機能を実装する例はありますか? これを行うもう1つの良い方法はありますか?

答えて

3

ポイントベースのゲームの問題は、あなたのアプリがそれにアクセスできるどこかでスコアを保存する必要があることです。その結果、技術に精通したユーザーはゲームをリバースエンジニアリングしてスコアを修正しようとする可能性があります。


ユーザがこのようなことをしないようにする最も簡単な方法は、あなたのアプリ専用のストレージにスコアを保存することです(このパスを参照しないで、getFilesDir()を使用してください)。 。しかし、これらのファイルにアクセスできるようになっても、ルートされた電話機のユーザは停止しません。

次のステップでは、任意のデータ形式(標準のjava Serializableを使用している可能性があります)を使用してファイルでこのスコアをシリアル化します。ユーザーはもうファイルを読み取ることができません。スコアを修正するには、Androidでの開発についての知識が必要です(&デシリアライズ解除)

セキュリティをさらに強化するには、このファイルをシリアル化した後で暗号化することができます。 。ファイルを暗号化する方法については、hereを参照してください。暗号化/復号化に必要な鍵をコードに格納します。

キーはコードに保存されているため、アプリの逆コンパイル後にキーを読み取ることができます。それを得ることを難しくすることを除いて、その周りに道はありません(セキュリティトラフのあいまいさ)。コードを難読化し、プロジェクト全体に散らばっている複数の部分で暗号化キーを分割することで、これを達成できます。


ユーザーが不正行為をするのを防ぐ完全な方法はないことにご注意ください。



側ノード:暗号化の輸出は、米国で規制されている - あなたのアプリは、より上の読み取りにスタートhere USA
でホストされているようにアプリトラフGoogle Playで公開を予定している場合、これはあなたに影響を与えますそれ。

+0

このライブラリを使用して保存するには:https://github.com/orhanobut/hawk/tree/hawk1 –

+1

ライブラリ自体はかなりよく見えます。私はまだスコアの正確な値を格納しませんでしたが補完的な値のようなもの(〜VARIABLEでjavaで行われる)。暗号化に関する輸出法を忘れないでください。 – Ch4t4r

+0

しかし、私はローカルストレージ –

関連する問題