2012-04-12 90 views
3

注意:這與android有關,但最好的答案可能不是平臺特定的,因此其他標籤。如何讓玩家難以破解遊戲級別的數據?

考慮一個類似憤怒的小鳥的遊戲:你有一堆關卡。每次你完成一個關卡,下一個關卡都可以玩,但不能玩。如何讓玩家更難以破解我的遊戲文件並解鎖應該不可用的關卡?假設進展數據存儲在本地。

我的想法:

在Android上,所有應用程序文件存儲在用戶只能訪問他們是否有root權限(默認情況下,他們不會做一個文件夾中,但它通常是很容易得到只要你有一點谷歌)。現在,我使用的SQLite數據庫,看起來是這樣的:

LevelId = pk | UnlockStatus = int, 0 = locked, 1 = unlocked, 2 = completed with 1 star, ... 

這是好的,只要用戶沒有根或一點也不熟悉,其中的應用程序文件存儲。如果他們有root用戶,那麼這個文件很容易編輯。

據我所知,憤怒的小鳥將其等級數據存儲在.lua文件中,至少根據其名稱。我找不到包含關卡信息的文本文件或數據庫文件。在文本編輯器中打開此.lua只顯示亂碼。我沒有試過十六進制編輯器。

使用sql表格非常方便。有沒有一種簡單的方法可以將進度數據存儲在sql表中,這樣用戶將有更難理解的時間?理想情況下,實施起來也不算太費時。作爲一個離線遊戲,如果玩家不喜歡它,我不在乎,所以我正在尋找最佳質量 - 實現時間的折衷。然而,理論上的答案產生更多的實施時間,相當多的質量也值得讚賞。

+0

如何對數據進行加密,然後將其存儲......沒有嘗試過自己..我認爲是可能的事...... – ngesh 2012-04-12 11:11:27

+4

正如你已經提到:如果一個球員想要破壞它自己,爲什麼要去到試圖阻止他們的麻煩? – shambulator 2012-04-12 11:15:24

+0

這樣做已經很難了,對於大多數玩家來說這絕對是遙不可及的。爲什麼要讓它更難? – 2012-04-13 05:04:52

回答

4

最好的辦法是使用某種加密方式保存數據。在android中,SQLite不提供數據庫級別的加密。但是,您可以對錶中的值(記錄)進行加密,並在查詢後將其解密。

的另一種方式,可以保存的數據作爲在某種在內部或外部存儲器的文本文件(例如.lua在憤怒的小鳥)的鍵/值對和對文件的內容進行加密。另一方面,在運行時解密並讀取您的鍵/值對。

Tadaaa!問題解決:)

+0

我的加密密鑰是什麼?如果我只是硬編碼一些隨機字符串,可以嗎?此外,我將不得不加密更多的狀態值,因爲'encrypt(1)'將具有相同的值爲所有級別。加密與級別數字級聯的狀態代碼是否足夠好? – IVlad 2012-04-12 11:16:06

+0

在我的一個應用程序中,我使用設備的藍牙地址(或者您可以嘗試wifi mac-address)作爲加密密鑰來加密數據。 Ooops,我剛剛宣佈了我的加密邏輯嗎? :p無論如何,用這樣的密鑰,你的數據解密只能綁定到那個加密它的設備。這取決於你想要加密多少數據。我會說,加密/解密所有的設置不會是一個問題來處理。 – waqaslam 2012-04-12 11:23:13

+0

你是絕對正確的,如果你想進行無縫解密數據(不提示用戶輸入密碼),你需要存儲的關鍵幾分,一旦有人發現這裏您取得那把鑰匙,他們可以將其恢復並且解密數據(並且重新加密修改的數據)本身。你不能真正解決這個問題,只要巧妙運用你如何存儲/形成的關鍵,使事情變得更加困難,你的攻擊者他們慢下來,並希望使其佔用足夠的時間,它不值得給他們了。 – jeffsix 2012-04-12 12:47:37

1

一個簡單的方法:存儲每個球員的不同級別的數據。

代碼小於5行:

//encrypt code: 
save_level = "level_txt" + "#"+ md5("gamename" + "playername" + level_txt) 

//decrypt code: 
level_plaintxt, md5_level = save_level.split("#") 
if (md5_level == md5("gamename" + "playername" + level_plaintxt)) 
    return level_plaintxt 
+0

將字符串鍵改爲我不知道的東西。或者,我會破解你的遊戲-_ !!! – fanlix 2012-04-12 11:18:48

+0

你對每個玩家意味着什麼?我只有一名球員,因爲它是一個離線遊戲。此外,如果玩家'x'知道'asdf'顯示他已完成的關卡,他知道他必須添加'asdf'才能解鎖其他關卡,不是嗎? – IVlad 2012-04-12 11:22:21

+0

Oh noes O(n)複雜性!如果你有超過50000的關卡,這將會運行緩慢!當你真的想要加密時不要使用散列。 – pgsandstrom 2012-04-12 11:23:47

1

防黑其被本地存儲在設備上(或最終遠程)的數據(遊戲二進制/電平數據/高分桌等)將總是可以被真正想要的人知道並且知道如何去做(可以解碼)。

添加只會變得更加困難(和這樣需要較長時間)黑客安全的每一層。有時,即使增加一層額外的安全性,也需要更多的時間來實施,而不是黑客來理解它。 (在計算曆史中有着名的例子,其中一個是XBox IIRC)。

默默安全是你在加密你的案例中的數據時所要做的。從長遠來看這是不夠的。特別是當你的項目遇到大量觀衆。