2013-07-24 63 views
-2

想象一下,我有一個遊戲,我需要爲每個用戶保存數據,比如關卡,高分,金牌......
如果我在本地保存了一些(在用戶的設備上)他們不是很安全,並且可以由擁有紮根設備和一定技能的用戶進行修改。 (如討論here保護數據庫免受根植設備

所以我需要把它們放在我的服務器上的數據庫 - 我用它連接到一個web服務和JSON。

但是後來我意識到這並不安全:如果有人可以獲得我的APK,他可以反編譯它,獲取用於發佈高分的代碼,並且編輯它總是發佈1,234,567(並再次編譯它)或者只是提取它併發布任何高分。

在高分的情況下,這不是一個大問題 - 但有了這個,基本上可以獲取/發佈應用中使用的任何東西。

如何保護我的應用程序/數據庫免受此影響?

我的想法:

  1. 加密的一切,我張貼:不可阻擋的工作,作爲加密發生在 設備
  2. 加密的一切,我用後從DB種子:由於「黑客」可以得到種子藏漢,沒有任何安全
  3. 生成每個連接的關鍵:同第一

用一句話: 只要「黑客」可以反映我的應用程序的行爲,是否有任何方法確保與我的數據庫的連接實際上是由我的應用程序打開而不是其他人?

+0

我認爲如果你將它們存儲在'SharedPreferences'中,它將是可見的,並且可能只能從你的應用程序訪問。 – g00dy

+0

1)afaik它可以在根植設備上訪問2)我需要在網上至少存儲一些數據(如高分 - 它是全球高分榜) –

+0

是的 - 你說得對,可以從一個植根於設備 - 這對你沒有用處。所以,分數數據等應該放在你的服務器上,並且每次訪問時都要訪問。 .apk文件的反編譯並不總是會給你整個代碼。我已閱讀過這篇文章,但不能保證可以獲得整個代碼。即便如此,如果數據在您的服務器上使用密碼進行保護,那麼如果沒有它,將很難獲得。 – g00dy

回答

1

你需要改變你的做法。如果您不希望用戶更改數據,請勿將其放在設備上。服務器必須是您提供的示例中的數據的主數據。儘可能使用本地數據庫作爲您用於顯示的緩存,然後根據您的服務器進行同步和驗證。這樣,根用戶選擇更改他的設備數據庫並不重要。發佈到您的服務器的所有數據都需要來自經過身份驗證的用戶。無法確保數據不會在用戶設備上被本地篡改。

反編譯你的應用程序不應該暴露任何方式讓用戶發佈數據到你的服務器。讓用戶用你的服務器進行身份驗證,並給他一張即將到期的票據/令牌作爲回報。看看AccountManager和示例SampleSyncAdapter。官方開發者網站也有一些很棒的閱讀。 Handling User Data

一般情況下,我們建議您儘量降低請求用戶憑據,進行網絡釣魚攻擊更顯眼,並且不太可能成功的頻率。而是使用授權令牌並刷新它。

只要可能,用戶名和密碼不應存儲在設備上。而應使用用戶提供的用戶名和密碼執行初始身份驗證,然後使用短期的特定於服務的授權令牌。

另請參閱Signing your application的工作方式,以確保只有「已批准」的應用程序版本才能與您的服務器進行通信。

+0

「如果您不希望用戶更改數據,請勿將其放在他們的設備上。」在我的榜樣中,這將如何成爲可能?我需要拿分並將其發送給數據庫。 –