Android安全性淺談

對於一款成熟的App,必定會開始涉及安全和性能的問題,這裏就先說一下安全性的問題,今天忽然收到咱們線上某app的安全性檢測報告,一看一千多個安全隱患感受這app徹底無安全性可言,仔細一看其實都是咱們開發過程的一個規範問題,雖然這款app不是我開發的,可是有不少安全隱患我也的確是沒有考慮過,這裏就不得不趕忙拓展補充能量了。html

ProGuard

在Android Studio當中混淆APK,藉助SDK中自帶的Proguard工具,只須要修改build.gradle中的一行配置便可。這個就很簡單了,基本都在用混淆。以前有些過基本混淆規android

Log

開發過程當中相信你們都會打印一下log查看信息的,特別是接口數據類的日誌,這些日誌一樣會泄露app中的信息,所以release版本的日誌屏蔽是很是重要的。使用原生的Log你們能夠自行封裝一個工具類,在打印日誌以前判斷是不是debug,debug模式下打印日誌。如今log框架也有不少,都有這樣的配置。debug模式判斷:安全

if(BuildConfig.DEBUG){
			//is debug
		}else{
			//is release 
		}
複製代碼

組件安全(exported)

Android中的四大組件 Activity,Service,Provider,Receiver 四大組件中都會一個共同的屬性:android:exported。而組件安全主要在於android:exported這個屬性,android:exported決定組件是否容許被其餘APP調用。app

  • android:exported 當Android sdk 的最小版本爲16或者更低時或組件設置了intent-filter他的默認值是true。若是是17和以上的版本默認值是false。
  • 組件訪問權限:若是須要被其餘app喚起建議加入自定義的權限,只有有權限才能調用。
  • intent傳輸:跳轉使用顯示跳轉,隱式跳轉可能存在被未知的第三方應用劫持的風險

自定義權限方法以下:框架

//定義權限
 <permission android:name="com.yz.permission.INTENT_OTHER"
        android:protectionLevel="normal" />

	//申請權限
    <uses-permission android:name="com.yz.permission.INTENT_OTHER"/>


<activity
    android:name=".TestActivity"
    android:exported="true"
    android:permission="com.yz.permission.INTENT_OTHER" />
	//指定權限

複製代碼

注:四大組件自定義權限方法相同,protectionLevel屬性是指權限的類型。官網給出的說明以下:ide

  • normal:這是最低風險的權限,若是應用聲明瞭此權限,也不會提示安裝應用的用戶受權(例如,若是聲明瞭定位權限,則應用到定位功能時,會明確提示用戶,是否授予定位權限,可是protectionLevel爲normal的不會明確提示,直接默認授予),系統直接默認該應用有此權限
  • dangerous:這種級別的權限風險更高,擁有此權限可能會訪問用戶私人數據或者控制設備,給用戶帶來負面影響,這種類型的權限或許不會默認受權
  • signature: 這種權限級別,只有當發請求的應用和接收此請求的應用使用同一簽名文件,纔會受權,而且是默認受權,不會提示用戶
  • signatureOrSystem:這種權限應該儘可能避免使用,偏向系統級,簽名保護級別應該足夠對於大多數需求和工做

調試安全

release版本應該禁止調試,application的android:debuggable屬性設置爲true時,攻擊者能夠經過動態調試來窺探客戶端的數據流和工做流,增長核心程序邏輯被破解的風險。工具

  • Android提供了isDebuggerConnected()方法,判斷是否有調試器鏈接
  • debuggable屬性判斷,release版本debuggable設置爲false,在程序中判斷debuggable值是否被修改 判斷debuggable代碼以下:
if (0!=(getApplicationInfo().flags&= ApplicationInfo.FLAG_DEBUGGABLE)) {
        //程序被修改成可調試狀態!!!
        android.os.Process.killProcess(android.os.Process.myPid());
  }
複製代碼

簽名安全

簽名是Andriod軟件一種有效的身份標識,簽名時推薦V1和v2所有勾選,簽名說明參考《AS打包簽名》,防止二次打包,判斷簽名是否一致。 獲取apk的簽名hash值與apk的簽名文件的hash值進行判斷,不一致說明apk被二次打包。 獲取簽名hash值的代碼以下:性能

public int getSignature(String packageName) {        
        PackageManager pm = this.getPackageManager();  
        PackageInfo pi = null;  
        int sig = 0;  
        try {  
            pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);  
            Signature[] s = pi.signatures;  
            sig = s[0].hashCode();    
        } catch (Exception e1) {  
            sig = 0;  
            e1.printStackTrace();  
        }  
        return sig;  
} 
複製代碼
相關文章
相關標籤/搜索