2017-03-06 20 views
1

我在這裏閱讀了很多問題,但沒有真正回答我的問題。我應該使用什麼設備唯一ID作爲加密某些值的密鑰

我知道存儲密鑰的最佳位置是服務器端,但我的應用沒有服務器。而且,每次用戶啓動應用程序時都要求輸入密碼,這也不是一種選擇。

從我讀過,有2個地方實際存儲的數據:

  • SharedPreference但它加密:這意味着,根用戶可以訪問XML文件方便,如果反編譯的apk可以得到實際的值
  • sqlite database但實際上只是使用sqlite數據庫瀏覽器來讀取數據的問題。

基本上我要存儲兩件事情:

  • 可以由用戶隨時通過登錄到Web瀏覽器
  • 中用戶購買的應用內購買來重置令牌。

對於應用程序購買我可以修復這個非常簡單:在每個應用程序的查詢啓動購買的項目。這意味着,即使應用程序在SharedPreferences中存儲值(對於查詢失敗的情況),如果不是這種情況,我仍然會覆蓋此值。

有一件事情是決定的:不要以純文本形式存儲它們,而是將其加密。 至於加密,我正在考慮爲每個應用程序安裝使用某種唯一的ID作爲AES的密鑰。因爲這是事情,例如,如果我使用所有設備上的相同硬編碼密鑰對應用內購買價值進行加密,則可以將來自購買設備的SharedPreference值複製到根設備上,並無需支付即可訪問該應用。我想避免這種情況,通過使用也許Settings.Secure.ANDROID_ID我可以簡單地加密一些在任何其他設備上都不相同的東西,更重要的是,甚至連開發人員都無法解密。我可以使用哪個密鑰取決於設備,並且允許該設備的特定加密。這意味着將備份複製到其他設備不起作用,因爲解密將返回不同的結果。

我知道在這方面有很多問題,可能我的問題會被低估,但是自從那個問題以來,許多android版本都發生了變化。

基本依然存在:我如何最安全地存儲一些與我的android應用相關的值?

+3

我不會在應用程序上購買應用程序,因爲這對我來說意味着卸載後無法恢復。我只需要使用用戶連接到互聯網並恢復購買的項目......通過設備上的請求將這些設置保存到sharedpreferences。由僅前向密碼加密器或別的東西解碼,只能比較值但不解密。 –

+1

https://developer.android。com/training/articles/user-data-ids.html – CommonsWare

+0

@ Code.IT應用程序購買存儲在Google Play上,我正在考慮將它們緩存在本地,以避免每個應用程序啓動時進行異步查詢。當然,他們可以在任何用戶的設備上恢復。我不確定你的意思是隻轉發密碼加密器,但對於令牌,我確實需要Web調用的實際值。感謝您的時間。 – Alin

回答

0

維明使用爲唯一的設備ID

public static String getDeviceIMEI(Context context) { 

    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 

    if (telephonyManager.getDeviceId() != null) 
     return telephonyManager.getDeviceId(); 

    return ""; 
} 
+0

謝謝你的回答。據我所知,並非所有的設備都有IMEI,從https://developer.android.com/training/articles/user-data-ids.html說「#1:避免使用硬件標識符」... – Alin

0

Settings.Secure #ANDROID_ID返回的Android ID作爲unique for each user 64位十六進制字符串。

import android.provider.Settings.Secure; 

private String android_id = Secure.getString(getContext().getContentResolver(), 
                 Secure.ANDROID_ID); 
相關問題