Android?App?如何防止抓包方法及分析
引言
在軟件開(kāi)發(fā)中,常用的抓包方式有 Charles 、 Fiddler和Burp,它們通過(guò)在手機(jī)網(wǎng)絡(luò)中添加代理的方式,然后安裝信任證書(shū),接著就可以在 App 請(qǐng)求的時(shí)候拿到請(qǐng)求數(shù)據(jù)。不過(guò),這也可能導(dǎo)致一些安全問(wèn)題,所以對(duì)于我們通常的處理方式是,對(duì)于線(xiàn)上運(yùn)行的包,需要防止這些抓包手段。
1,使用無(wú)代理 Proxy.NO_PROXY
在Android開(kāi)發(fā)中,大部分的App的網(wǎng)絡(luò)請(qǐng)求都是基于charles 和 fiddler 來(lái)進(jìn)行抓包的,對(duì)網(wǎng)絡(luò)客戶(hù)端使用無(wú)代理模式即可防止抓包,代碼如下。
OkHttpClient.Builder() .retryOnConnectionFailure(true) .proxy(Proxy.NO_PROXY) .sslSocketFactory(ssl, trustManager) .build()
通常情況下上述的辦法有用,但是無(wú)法防住使用 VPN 導(dǎo)流進(jìn)行的抓包( Drony + Charles),使用VPN抓包的原理是,先將手機(jī)請(qǐng)求導(dǎo)到VPN,再對(duì)VPN的網(wǎng)絡(luò)進(jìn)行Charles的代理,繞過(guò)了對(duì)App的代理。
2,使用證書(shū)校驗(yàn)
此種方式可以有效的防止抓包,需要在App端嵌入證書(shū),下面是證書(shū)校驗(yàn)的一些說(shuō)明:
下面是使用Okhttp配合X509TrustManager對(duì)服務(wù)器證書(shū)進(jìn)行校驗(yàn)的邏輯:如果服務(wù)器證書(shū)的 subjectDN 和嵌入證書(shū)的 subjectDN 一致,我們?cè)龠M(jìn)行簽名內(nèi)容 signature 的比對(duì),如果一致則說(shuō)明合法,否則是不合法的,不進(jìn)行鏈接操作。
首先,我們需要從本地讀出證書(shū),獲取一個(gè)X509Certificate。
val myCrt: X509Certificate by lazy { getCrt(R.raw.my_ca) } private fun getCrt(@RawRes raw: Int): X509Certificate { val certificateFactory = CertificateFactory.getInstance("X.509") val input = ApplicationContext.resources.openRawResource(raw) input.use { return certificateFactory.generateCertificate(input) as X509Certificate } }
然后,檢查服務(wù)器證書(shū)時(shí)對(duì)比嵌入的證書(shū)是否合法。
private fun getTrustManagerInRelease(): X509TrustManager { return object : X509TrustManager { override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String?) {} override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf() override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String?) { val myCrt: X509Certificate = myCrt if (chain[0].subjectDN.name == myCrt.subjectDN.name) { if (!myCrt.signature!!.contentEquals(chain[0].signature)) { throw SSLHandshakeException("簽名不符!") } } } } }
最后,在每次請(qǐng)求前將自定義的 SSLSocketFactory 和 X509TrustManager 填充到Okhttp 客戶(hù)端中。
private fun getClient(ssl: SSLSocketFactory, trustManager: X509TrustManager): OkHttpClient { return OkHttpClient.Builder() .retryOnConnectionFailure(true) .proxy(Proxy.NO_PROXY) .sslSocketFactory(ssl, trustManager) .build() }
經(jīng)過(guò)上面的操作后,就基本解決了 Drony + Charles 抓包問(wèn)題。不過(guò)為了安全,很多的銀行類(lèi)和支付類(lèi)應(yīng)用還會(huì)進(jìn)行雙證書(shū)的校驗(yàn)。
以上就是Android App 如何防止抓包方法及分析的詳細(xì)內(nèi)容,更多關(guān)于Android App防止抓包的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android實(shí)現(xiàn)測(cè)試環(huán)境噪音分貝
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)測(cè)試環(huán)境噪音分貝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Libgdx解決部分Android機(jī)型鎖屏崩潰的方法
今天小編就為大家分享一篇關(guān)于Libgdx解決部分Android機(jī)型鎖屏崩潰的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10Android開(kāi)源組件SlidingMenu側(cè)滑菜單使用介紹
這篇文章主要介紹了Android開(kāi)源組件SlidingMenu側(cè)滑菜單使用介紹,本文給出了SlidingMenu的項(xiàng)目地址、使用代碼、使用配置、常用的一些屬性設(shè)置中文注解等內(nèi)容,需要的朋友可以參考下2015-01-01Flutter實(shí)戰(zhàn)教程之酷炫的開(kāi)關(guān)動(dòng)畫(huà)效果
這篇文章主要給大家介紹了關(guān)于Flutter實(shí)戰(zhàn)教程之酷炫的開(kāi)關(guān)動(dòng)畫(huà)效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Android自定義View播放Gif動(dòng)畫(huà)的示例
本篇文章主要介紹了Android自定義View播放Gif動(dòng)畫(huà)的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Android GridView擴(kuò)展仿微信微博發(fā)圖動(dòng)態(tài)添加刪除圖片功能
這篇文章主要為大家詳細(xì)介紹了Android GridView擴(kuò)展仿微信微博發(fā)圖動(dòng)態(tài)添加刪除圖片功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android recyclerview實(shí)現(xiàn)縱向虛線(xiàn)時(shí)間軸的示例代碼
本文主要介紹了Android recyclerview實(shí)現(xiàn)縱向虛線(xiàn)時(shí)間軸的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Android實(shí)現(xiàn)創(chuàng)建或升級(jí)數(shù)據(jù)庫(kù)時(shí)執(zhí)行語(yǔ)句
這篇文章主要介紹了Android實(shí)現(xiàn)創(chuàng)建或升級(jí)數(shù)據(jù)庫(kù)時(shí)執(zhí)行語(yǔ)句,是比較實(shí)用的功能,需要的朋友可以參考下2014-08-08