標籤:
http://developer.android.com/training/articles/security-tips.html
1.資料存放區
內部儲存
internal storage儲存的資料,只能由App自己訪問。
如果是敏感性資料,推薦使用KeyStore。
外部儲存
外部儲存,例如SD卡,任何app都可以讀寫,也可以被使用者移除,所以不能用來儲存敏感性資料。
如果處理來自外部儲存的資料,必須要做驗證。
強烈建議不要儲存可執行檔,或者用於動態載入的類檔案。如果一定要這麼做,這些檔案必須簽名並加密。
Content Provider
他提供了一種結構化的儲存機制來限制自己的app或者其他app訪問限定的內容,
如果你不打算讓其他的app訪問你的content provider,設定android:exported=false
如果建立了Content Provider給其他app使用,必須指明相應的許可權。
如果使用content provider在幾個app之間共用資料,需要android:protectionLevel =signature
2.許可權
請求許可權
儘可能的減少請求的許可權,例如資料儲存在內部儲存區而不是儲存在外部儲存區。
建立許可權
盡量少定義一些許可權。
如果定義許可權,必須有一個字串明確的告訴使用者做了什麼,字串必須翻譯,使用者可以拒絕這個要求而不安裝app。
3.網路
IP網路
因為行動裝置經常頻繁的串連沒有加密的網路,例如公用Wi-Fi熱點,所以推薦使用Https而不是Http。
http訪問推薦使用HttpsURLConnection,Socket訪問,推薦使用SSLSocket。
App使用localHost來處理進程間通訊,這種方式並不推薦,因為可以被其他app利用。最好使用Service。
不要信賴http或者其他非安全性通訊協定下載的資料。
移動資料
不要用簡訊來儲存或者傳遞敏感性資料,因為其他App可以讀取簡訊。
4.驗證輸入
如果使用native code,從網路、其他進程傳過來的資料都可能引入安全問題。
注意訪問script或者sql 注入攻擊。
5.處理使用者資料
盡量避免儲存或者傳輸使用者敏感的資料,例如email.
如果需要訪問使用者名稱密碼之類的資訊,可能需要提供隱私保護原則給使用者。
請不要暴露敏感性資料給第三方不信任的App。
如果需要GUID,自己建立一個,不要使用IMEI或者手機序號。
謹慎使用裝置log,log也是一種共用資源,其他App可以請求Read_Logs許可權來訪問log。
6.WebView
webView會載入HTML和Javascript,可能引入跨網站攻擊。如果不需要使用javascript,請不要調用setJavaScriptEnabled().
addJavaScriptInterface() 最好只給自己的App使用。
如果使用webView訪問了敏感性資料,記得清理緩衝。
7.憑據
盡量不要向使用者請求Credentials。
如果可能的話,盡量不要在裝置上儲存使用者名稱和密碼,推薦使用短期有效token。
使用AccountManager來處理一些憑據資訊,或者Keystore,Keychain。
8.加密
如果需要自訂密碼編譯演算法,推薦使用系統的AES胡總和RSA
9.處理序間通訊
推薦使用Intent,Binder,Messenger,Servier,BroadCast,而不是傳統的linux技術實現。
10.Intent
如果Intent傳遞的資料包含敏感資訊,需要制定許可權,保證擁有許可權的app可以接收。
11.Service
預設情況下,Service不要export,不要被其他App調用。
如果需要,請加上許可權,
調用之前,可以用 checkCallingPermission() 檢查一下
12 binder and messenger
定義許可權和介面
13. broadcast receiver
這個可以被任何一個app調用,注意定義許可權
14 動態載入代碼
強烈建議不要從外部動態載入代碼,如果需要,請簽名並使用DexClassLoader.。
15 虛擬機器安全
不推薦動態載入代碼
16 Native Code
盡量使用Android SDK,實在不行,使用Android NDK。
Android 安全提示 筆記