Android 應用安全防護措施

一:靜態代碼塊分析

    使用靜態代碼分析能夠再不運行程序的前期下對程序存在的潛在問題進行分析,如控制內存使用越界等。SDK提供了一個靜態代碼分析工具lint,這個工具能夠再經過掃描工程的全部代碼和資源文件後根據所得結果,將檢測的問題分爲6大類
正確性、可用性、安全性、無障礙性、性能、國際化。能夠根據問題類型和內容將代碼進行修改和優化。javascript

二:Android Java代碼混淆

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

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

    Android 應用程序在發佈前,都必須被簽名。假設用於簽名的密鑰不被泄露或共享,咱們能夠認爲,當被破解的Android軟件從新打包後,其 「簽名」必然與官方版本不一樣
其核心點就是在你的打包發佈apk應用中,若是輸入了你的私鑰,會同時自動生成一個公鑰的,而且這個公鑰根據你每次打包的時候私鑰的變化而發生變化的。
而這個私鑰只有你本身知道,公鑰是能夠公開的,固然對於發佈的應用開發者他也不知道公鑰到底公開,怎麼公開,公開給誰。android

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中定義新的權限,譬如:app

<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。能夠將二者結合使用,才能確保組件安全地接收來自受權的發送的信息。

相關文章
相關標籤/搜索