2012-12-29 60 views
11

我已完成開發用於應用程序結算v3的我的應用程序。我的應用程序是一個考試幫助應用程序,它具有插入到數據庫中的問題列表。令我感到擔憂的是安全性超越了proguard,幾乎沒有其他的安全措施。我的應用程序查詢所購商品的庫存,因此存儲購買不成問題。在應用程序帳單安全

因此,第一個問題是有人可以反編譯應用程序(我已經完成),甚至使用proguard你可以沒有太多的困難檢索所有問題。

接下來是應用程序的公鑰。這可以很容易地從我的應用程序中取得,並根據開發人員指南,這是我應該保持安全。

但是我真的不知道如何實現任何形式的安全。或者甚至我應該走多遠安全。如果沒有服務器,如果我將所有設備都保存在設備上,我認識到它不會很完美(遠非如此),但我至少會像黑客一樣被嚇倒而不是好玩。

所以基本上,問題是:

我應該使用什麼類型的安全性和如何使用它?只要指向我一步一步地通過它的鏈接,所以我可以理解這將是驚人的。

非常感謝!

說明:

沒有涉及服務器。數據存儲在應用程序中。在查詢庫存時(通過queryinventoryasync方法),如果庫存被購買或沒有庫存,它會返回並在每次應用啓動時運行。在應用程序結算本身,我認爲是好的,我更多地瞭解我自己的應用程序的應用程序公鑰 - 我的意思是以某種方式使得難以複製,但目前我已經把它分成15個字符串,我只是「添加」它們在運行時彼此相互關聯,但只是將它作爲一個字符串而已,幾乎沒有什麼更好的了。我想加密它只是不知道如何。

+0

http://stackoverflow.com/questions/14352758/android-in-app-billing-securing-application-public-key – Krishnabhadra

回答

18

好問題。

公鑰必須在設備上可用才能使用。一旦它出現在設備上,它就不再受到保護。關鍵本身並不是祕密,但我們需要使其可能的替代成爲一項更加困難的任務。

你可以做的是使用所謂的XOR加密。這裏是XOR加密器和解密器方法的例子。

public static String xorEncrypt(String input, String key) { 
    byte[] inputBytes = input.getBytes(); 
    int inputSize = inputBytes.length; 

    byte[] keyBytes = key.getBytes(); 
    int keySize = keyBytes.length - 1; 

    byte[] outBytes = new byte[inputSize]; 
    for (int i=0; i<inputSize; i++) { 
     outBytes[i] = (byte) (inputBytes[i]^keyBytes[i % keySize]); 
    } 

    return new String(Base64.encode(outBytes, Base64.DEFAULT)); 
} 

public static String xorDecrypt(String input, String key) { 
    byte[] inputBytes = Base64.decode(input, Base64.DEFAULT); 
    int inputSize = inputBytes.length; 

    byte[] keyBytes = key.getBytes(); 
    int keySize = keyBytes.length - 1; 

    byte[] outBytes = new byte[inputSize]; 
    for (int i=0; i<inputSize; i++) { 
     outBytes[i] = (byte) (inputBytes[i]^keyBytes[i % keySize]); 
    } 

    return new String(outBytes); 
} 

如何你需要的是選擇一個密碼字符串(String key),並用它加密你的公鑰(String input)。這個加密密鑰可以存儲在一個類中。當您需要真正的密鑰值時,請使用密碼和公共(加密)密鑰字符串撥打xorDecrypt()。密碼也是您存儲在代碼中的字符串。正如我所說的,我們並沒有真正保護它,但是我們使它更難找到和/或更換。

您可以在如何組合加密的公鑰和密碼上添加更復雜的邏輯。這只是增加了更多的複雜性,但不會給你任何保證你的密鑰不會被解密。在任何情況下Google confirms異或加密總比沒有好。

Android 4.3增加了一些可用於存儲公鑰的更多安全功能。該解決方案需要服務器通信和硬件支持才能真正安全。這些是Key Chain enhancements and Android Keystore Provider

+0

真棒的答案。此外,我應該將我的加密公鑰分解成多個部分,我將這些部分組合在一起,反轉字符串和混洗字符?我的理解是這個想法是阻止某人用你的鑰匙取代他們的鑰匙,從而將從購買物品中獲得的錢轉移到他們的賬戶。 – AndroidPenguin

+1

謝謝! a)是的,您也可以分解您的加密公鑰。這會讓黑客的生活更加困難......或者對他們來說更有趣。 b)不是真的。這個想法是讓它更難以用假冒來替換你的公鑰。然後重新組裝您的應用,開始接受假服務器響應。因此黑客可以在不付費的情況下啓用功能。 –

+0

'int keySize = keyBytes.length - 1;'這不是杞人憂天。 i%keySize總是小於keySize,所以我們不必減去1的keySize –