2013-06-20 55 views
8

Android開發者表示,以下有關存儲您的應用程序的公共密鑰在您的項目:Android應用內安全建議 - 這是什麼意思?

安全建議:強烈建議您不要 硬編碼的確切公共許可證密鑰字符串值,按照 提供Google Play。相反,您可以在運行時從子字符串構造整個公共許可證密鑰 字符串,或者在將其傳遞給構造函數之前從加密的 存儲中檢索它。這種方法使得 更難以讓惡意的第三方修改APK文件中的公開 許可證密鑰字符串。

這應該是不言自明的?我不明白他們希望我做什麼。

他們在這個例子的評論中說了同樣的話,但是他們沒有真正證明他們的指示是什麼意思。下面是這樣說的:

而不是僅僅存儲在這裏嵌入 的 *程序的整個文本字符串,構建從碎片或 *使用位操作(例如XOR在運行時的關鍵,與其他一些字符串)隱藏 *實際的密鑰。密鑰本身並不是祕密信息,但我們不想讓攻擊者容易地用自己的 *代替公鑰,然後從服務器僞造消息。

那麼一個人究竟能做到這一點呢?

回答

2

android開發人員想說你需要與你的應用程序進行任何支付的谷歌同步的「公鑰」,它不應該直接在你的應用程序源代碼中使用,因爲它可以很容易地被黑客攻擊由任何一個。 因此,一種方法是將您的公鑰存儲在服務器端,一旦您從Google Play獲得響應以驗證密鑰將響應發送到服務器並在服務器上執行您的操作。

 /** 
     * String transformation by XOR-ing all characters by value. 
     */ 
     static String stringTransform(String s, int i) { 
     char[] chars = s.toCharArray(); 
     for(int j = 0; j<chars.length; j++) 
     chars[j] = (char)(chars[j]^i); 
     return String.valueOf(chars); 
     } 
+0

因此谷歌建議「相反,你可以在運行時從子構建整個公共許可證密鑰字符串,或從加密存儲庫中進行檢索,」 從服務器「從加密存儲庫中檢索」 retrieveing呢?什麼是安全的方式來構建它在運行時從字符串描述? –

+1

將所有交易驗證邏輯到你的服務器,並使用HTTPS連接到它。 – skygeek

+0

和串變換你需要實現自己的邏輯或爲前看到更新的答案。 – skygeek

1

這是一個非常基本的信息,他們試圖說。讓我們來看看這個例子:

有些開發商可能存儲有執照的字符串本身:

private static final String LICENSE_1="xxx-yyy-zzz" 
private static final String LICENSE_2="xxz-yyz-zzz" 
private static final String LICENSE_N="xxz-yyz-zzz" 

private ArrayList<String> licenseList=new ArrayList<String>(); 

licenseList.add(LICENSE_N); 

他們,他們可能要用戶輸入其車牌號碼,所以他們會做這樣的事情:

if(licenseList.contains(ExitText.getText().toString()) 
    //allow 
else 
    //disallow 

現在我可以反編譯這個程序,並得到所有的許可證:d

如果你沒有在你的代碼不得不像上面什麼,我可以繞過您授予許可的唯一途徑ing是:如果在本地完成,可以通過像GameCIH那樣入侵內存。內存黑客攻擊只是一個例子,攻擊者可能會做各種各樣的事情。你不能阻止他們,但是,你可以讓他們的生活變得更難。

+0

這證明了該漏洞。我明白了。字符串分解爲字符串。但他們要求你做什麼來保護你的應用?他們有具體的建議,我不明白他們。 –

+0

對不起,我不知道很多關於如何按位運算的代碼完成,但是,我可以告訴你關於你的應用程序是如何被破解。如上所述,這種方法使得它更加困難。讓即使你有你的客戶端邏輯實現的按位運算,如果我解密您的應用程序,我仍然可以做任何我想要它做的,因爲我可以看到你的邏輯說。然後,我可以重新編譯您的應用並將其發佈到私人應用商店或文件商店。 – Milan