Android 應用安全防禦措施

maweiliang發表於2017-04-07

一:靜態程式碼塊分析

    使用靜態程式碼分析可以再不執行程式的前期下對程式存在的潛在問題進行分析,如控制記憶體使用越界等。SDK提供了一個靜態程式碼分析工具lint,這個工具可以再通過掃描工程的所有程式碼和資原始檔後根據所得結果,將檢測的問題分為6大類
正確性、可用性、安全性、無障礙性、效能、國際化。可以根據問題型別和內容將程式碼進行修改和優化。

二:Android Java程式碼混淆

    混淆就是對釋出出去的程式進行重新組織和處理,使得處理後的程式碼與處理前程式碼完成相同的功能,而混淆後的程式碼很難被反編譯,即使反編譯成功也很難得出程式的真正語義。被混淆過的程式程式碼,仍然遵照原來的檔案格式和指令集,執行結果也與混淆前一樣,只是混淆器將程式碼中的所有變數、函式、類的名稱變為簡短的英文字母代號,在缺乏相應的函式名和程式註釋的況下,即使被反編譯,也將難以閱讀。同時混淆是不可逆的,在混淆的過程中一些不影響正常執行的資訊將永久丟失,這些資訊的丟失使程式變得更加難以理解。

三:apk數字簽名校驗的防止應用被重新打包

    Android 應用程式在釋出前,都必須被簽名。假設用於簽名的金鑰不被洩露或共享,我們可以認為,當被破解的Android軟體重新打包後,其 “簽名”必然與官方版本不同
其核心點就是在你的打包釋出apk應用中,如果輸入了你的私鑰,會同時自動生成一個公鑰的,並且這個公鑰根據你每次打包的時候私鑰的變化而發生變化的。
而這個私鑰只有你自己知道,公鑰是可以公開的,當然對於釋出的應用開發者他也不知道公鑰到底公開,怎麼公開,公開給誰。

public  String getApkSignatureMD5(String apkPath) throws Exception {
        Class clazz = Class.forName("android.content.pm.PackageParser");
        Method parsePackageMethod = clazz.getMethod("parsePackage", File.class, String.class, DisplayMetrics.class, int.class);

        Object packageParser = clazz.getConstructor(String.class).newInstance("");
        Object packag = parsePackageMethod.invoke(packageParser, new File(apkPath), null, content.getResources().getDisplayMetrics(), 0x0004);

        Method collectCertificatesMethod = clazz.getMethod("collectCertificates", Class.forName("android.content.pm.PackageParser$Package"), int.class);
        collectCertificatesMethod.invoke(packageParser, packag, PackageManager.GET_SIGNATURES);
        Signature mSignatures[] = (Signature[]) packag.getClass().getField("mSignatures").get(packag);
        Signature apkSignature = mSignatures.length > 0 ? mSignatures[0] : null;
        if(apkSignature != null) {
        return StringUtils.md5(apkSignature.toCharsString());
        }
        return null;
        }複製程式碼

四:使用第三方工具對於apk應用進行加殼

    目前已經有一些搞安全的公司在做一些apk加密,加殼的工作,其中有梆梆加密,愛加密, apkprotectlite 等軟體能夠將你的apk加密,加殼,防止應用被黑客破解掉,加大軟體的安全性。

五:資料儲存加密

    資料安全的隱患有:
    資料備份,如果應用程式允許使用者備份私有資料,資料就可以直接複製到pc 上,這樣資料就會完全暴露給使用者。
惡意軟體:惡意軟體有可能已用漏洞訪問到私有資料,造成資料洩露。
對非常重要的資料在儲存到檔案之前,需要對資料進行加密操作。
    資料加密考慮的因素有:
    金鑰:加/解密使用的金鑰不能寫在程式碼中,可以由使用者輸入或程式隨機產生。
    金鑰的儲存:金鑰儘量不要儲存到裝置上,可以將金鑰分成幾段亂序儲存,並且金鑰經過一些計算後作為加/解密的金鑰。如SHA-1.
加密後資料處理:由於加密演算法加密後的資料為二進位制資料,因此在儲存時,為了防止出錯,可以將資料轉換成ASCII字元的形式。一般推薦使用Base64。

六:BroadCast Receive 安全

    1. 一些敏感的廣播並不想讓第三方的應用收到 ;
    2. 要限制自己的Receiver接收某廣播來源,避免被惡意的同樣的ACTION的廣播所干擾,我們可以為BroadCast Receive 新增相應的許可權來控制,可以從接收方和傳送方兩個方面加以保護。
    傳送方措施:誰有權收我的廣播
這種情況下,可以在應用發廣播時新增引數宣告Receiver所需的許可權。
(1)首先,在Androidmanifest.xml中定義新的許可權,譬如:

<permission android:name= "com.android.permission.XXX_XXX"/>複製程式碼

(2)然後傳送廣播時將此許可權當做引數傳入:

sendBroadcast("com.android.XXX_ACTION","com.android.permission.XXX_XXX");複製程式碼

(3)在Receiver應用的AndroidManifest.xml中要新增對應的XXX_XXX許可權。

<uses-permission android:name="com.android.permission.XXX_XXX"/>複製程式碼

    這樣做之後就使得只有具有permission許可權的Receiver才能接收此廣播要接收該廣播,
接收方措施:誰有權給我發廣播
(1)在AndroidManifest.xml中定義新的許可權SEND_XXX,例如

<permission android:name="com.android.SEND_XXX"/>複製程式碼

(2)在Receiver app的Androidmanifest.xml中的tag裡新增許可權SEND_XXX的宣告,如下:

<receiver android:name=".XXXReceiver" 
          android:permission="com.android.permission.SEND_XXX"> 
    <intent-filter>
         <action android:name="com.android.XXX_ACTION" /> 
    </intent-filter>
</receiver>複製程式碼

(3)要傳送這種廣播,需要在AndroidManifest.xml中也宣告使用該許可權即可,如下:

<uses-permission android:name="com.android.permission.SEND_XXX"/>複製程式碼

    這樣一來,該Receiver便只能接收來自具有該send_permission許可權的應用發出的廣播。
所以,廣播可以從傳送方和接收方兩個方面加以保護,傳送方可以通過為BroadCast Intent 設定許可權的方式,確保該BroadCast Intent 只允許被授權的BroadCast Receive 接收,防止將BroadCast Intent 誤傳給危險的接收方;相反的,接收方Receive 也可以為自己設定訪問許可權,要求所接收的BroadC ast Intent 必須必備所設許可權,防止誤收到危險的BroadCast Intent。可以將兩者結合使用,才能確保元件安全地接收來自授權的傳送的資訊。

相關文章