2015-04-05 64 views
0

榜在我的遊戲當前存儲在SharedPreferences作弊:SharedPreferences和Android遊戲

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <long name="level_1_score" value="1000" /> 
    <long name="level_2_score" value="1100" /> 
</map> 

與此類似,分數可以上紮根設備進行操作。 (該XML文件被拉到PC,編輯,然後推回到設備)。

防止這種情況的最佳方法是什麼?

+0

爲什麼你在意用戶是否在自己的設備上改變了自己的高分? – CommonsWare 2015-04-05 11:35:46

+0

總分將被提交給公共排行榜。這個分數是通過總結個人水平分數來計算的。 – Pawel 2015-04-05 11:42:05

+0

那麼爲什麼'SharedPreferences'中的值不僅僅是一個本地數據緩存,其中記錄系統是服務器? – CommonsWare 2015-04-05 11:42:40

回答

1

也許你可以使用sharedPreferences和MODE_PRIVATE,但是如果你想確信你可以散列名稱和值,並添加一些額外的未使用的字段來檢測是否有人試圖改變你會知道的偏好。例如

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <long name="asdadadad" value="ASDASDASDAS" /> 
    <long name="asdadadadas" value="ADQOWI232DJQO1231" /> 
    <long name="level_1_score" value="1000" /> 
    <long name="level_2_score" value="1100" /> 
</map> 

你散列名稱和值,你會得到的圖片像這樣的。當你解密asdadadad時,你會得到level_1_score,當你解密ASDASDASDAS時,你會得到一些整數(用字符串寫)。 如果用戶更改散列值,它可能解密爲非整數值(這將不可能解析爲整數)

如果不知道您的散列鍵,將無法解密,該鍵將被保存爲某個常量字段你的程序。

而且你可以製作一些這樣的陷阱字段,用戶可能會認爲得分xml的名字是level_1_score,但是如果用戶改變了這一點,你可以捕獲用戶作弊。 (因爲它沒有使用)

2

最簡單的方法可能是使用Google的App Licensing庫中的PreferenceObfuscator。這仍然可以通過反編譯你的應用程序來打敗,但屏障要高得多。

0

是的,即使在MODE_PRIVATE中,根設備應用程序也可以訪問您的Shared Prefs。最糟糕的是,使用與您的遊戲應用程序的共享偏好設置相同的UID可以編輯。

但是,爲什麼不嘗試加密呢? ;)

確保將密鑰保存在服務器上。

+0

如果您將密鑰保存在服務器上,則必須提供https連接:D或用戶可以使用程序等'wireshark'捕獲流量,而不是解密它。 但誰會爲遊戲做? O.o – 2015-04-05 11:36:21

+0

是的,總有一種方法。但是這可以防止大多數餅乾,因爲密鑰不會在代碼中硬編碼。如果有人拿到遊戲的apk文件,他們可以解開課程並找到密鑰。 – Kay 2015-04-05 11:39:07

+0

是的,您可以做的最好的事情是防止用戶輕易破解您的代碼。 – 2015-04-05 11:42:40