2014-01-29 19 views
2

我不明白黑客在進入移動應用時能看到什麼,也看不到,例如android。他反編譯.apk,然後看到一些.class files。例如,如果我在文件中加密一個鍵/值對,我仍然需要從代碼中調用該鍵,如果黑客可以看到代碼,無論密鑰是否加密,他都會知道我是哪個鍵打電話?在哪裏存儲我的密鑰以便在移動設備上加密數據?

我的目標是在我的應用程序中保留一些加密的字符串,例如我的應用程序的Twitter帳戶ID。 有些話題談論「一把私鑰讀取,什麼是用公鑰加密的」,但如果我使用它們,我仍然需要將它們存儲在我的應用程序的某處...

回答

1

不完全瞭解您的要求,但經驗法則總是假設客戶端不被信任。 你必須確保

  • 所有的解密應該在你的服務器(你信任)中完成。
  • 客戶端應該永遠不能訪問解密的數據(除非您想要)。因此,需要直接訪問解密數據的代碼的任何部分都應在服務器中。
  • 客戶端應該只有加密數據(如果它必須存儲數據)。
  • 客戶端不應該能夠訪問用於加密數據的私鑰。

如果您的客戶必須能夠直接訪問關鍵數據,那麼您唯一的辦法是使用模糊處理技術(基本上隱藏您的數據/代碼,使其難以發現/理解)。當然,所有的混淆技術最終都會被一個堅定的黑客擊敗。您必須決定數據的價值,黑客嘗試訪問您的數據的可能性有多大。 舉一個極端的例子:使用obfusucation存儲您的Twitter帳戶和密碼非常糟糕。存儲twitter-url-可能不會那麼糟糕。

+0

你是對的,因爲像twitter這樣的東西,需要訪問互聯網,我可以讓它到服務器。有一件事,我不明白:「隱藏你的數據/代碼」:他能讀取.class文件,並看到我們在保存某些特定數據之前調用特定且相同的密鑰?例如,我需要檢索級別密鑰,我應該怎麼做?例如,加密名稱「級別」,並用加密的「級別」名稱調用密鑰......他不能看到我加密了「級別」並查找了級別的加密密鑰嗎? – Paul

+1

原則上,是的。如果「級別」的值在客戶端存儲或創建。訣竅是讓它不那麼明顯,價值不是水平。您可以使用Proguard進行代碼混淆。對於字符串,您可能需要嘗試其他人建議的方法。另外,您可以查看https://developers.google.com/games/services/android/antipiracy或https://developer.android.com/google/play/licensing/overview.html以嘗試確保客戶端未修改。 – nedR

1

您可以從您的鑰匙服務器,而啓動應用程序。也不管理sharedPrefrence或Sqlite中的應用購買細節。因爲在根用戶設備中用戶可以從根瀏覽器或sqlite編輯器應用程序中看到該數據文件,因此用戶可以更改值。

+0

用於同應用程序,你的意思是,我們必須與他們在-應用程序對象添加每個用戶在數據庫中?我正在尋找創建一個應用程序以供離線使用...... – Paul

+1

只需檢查用戶是否在每次啓動應用程序時都購買任何物品,以免黑客從sharedpref更改您的數據。或sqlite比用戶有原始數據沒有改變一個。要檢查已拆分的項目,請參閱http://developer.android.com/google/play/billing/api.html –

+0

@SanketKacghela的第3點,謝謝,他無法讀取.class文件並根據需要更改它。比如更改從服務器接收到的結果,或訪問指定不同應用程序內部的「public enum」等? – Paul

1

一個非常堅定的人可以破解它,但破解加密字符串並阻止大多數黑客是一大痛苦。特別是如果你用ProGuard之類的東西混淆你的代碼。

Answer to a similar question for details on how to encrypt

+1

謝謝,是的,其實我可能更喜歡混淆好於100%的安全性,因爲我希望該應用程序可以在離線狀態下使用,但應用程序內置,但是......有一件事我不明白,您在密碼中寫入密鑰代碼,黑客不會訪問該代碼,並讓他用密鑰,解密的私鑰和您用於加密的方法來讀取該字符串? – Paul

相關問題