上海千语创想科技有限公司
 175-2108-6175
网站建设资讯详细

Android App如何防止抓包,Android防止抓包的方法

日期:2020-07-18  作者:千语创想  浏览:4577

首先我们要知道常用的抓包方式有 Charles 和 Fiddler。他们通过在手机网络中添加代理的方式,拿到 App 的请求。

如果是 Https 连接的话,我们要先在手机中添加 Charles或Fiddler 的证书,然后Charles通过修改服务器发送证书链,让手机信任Charles 的证书,从而拿到 App 的请求。

下面是一些对策:

一、使用无代理 Proxy.NO_PROXY

charles 和 fiddler 都使用代理来进行抓包,对网络客户端使用无代理模式即可防止抓包,如

OkHttpClient.Builder()

            .retryOnConnectionFailure(true)

            .proxy(Proxy.NO_PROXY)

            .sslSocketFactory(ssl, trustManager)

            .build()

通常情况下上述的办法有用,但是无法防住使用 VPN 导流进行的抓包( Drony + Charles)

使用VPN抓包的原理是,先将手机请求导到VPN,再对VPN的网络进行Charles的代理,绕过了对App的代理。

二、使用证书校验

这种方式要在app嵌入证书,以okhttp为例:

当okhttp使用X509TrustManager对服务器证书进行校验时,如果服务器证书的 subjectDN 和嵌入证书的 subjectDN 一致,我们再进行签名内容 signature 的比对,如果不一致,抛出异常。示例代码如下:

首先从本地读出证书,获取一个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

    }

}

检查服务器证书时对比嵌入的证书

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("签名不符!")

                }

            }

        }

    }

}


将自定义的 SSLSocketFactory 和 X509TrustManager 将入到 okhttp 客户端

    private fun getClient(ssl: SSLSocketFactory, trustManager: X509TrustManager): OkHttpClient {

        return OkHttpClient.Builder()

            .retryOnConnectionFailure(true)

            .proxy(Proxy.NO_PROXY)

            .sslSocketFactory(ssl, trustManager)

            .build()

    }

这样一来便无法通过 Drony + Charles 进行抓包了

来千语创想移动低代码开发平台学习更多APP开发知识:app开发app制作app开发源码下载app开发框架app开发工具等免费获取。

千语创想-专业APP开发app定制服务商,提供一站式移动应用解决方案,满足您的各类需求,欢迎免费评估需求和获取报价。

 

立即免费在线制作一个APP,新手注册即送开发大礼包

提交app定制需求,免费获取报价和周期:

电脑请点击https://www.qianyuthink.com/?url=/index?uzchannel=500

手机请点击https://www.qianyuthink.com/?url=/m/customizedservice?uzchannel=500



转载请注明来自:https://www.qianyuthink.com/news/7891.html

填写您的项目需求给我们

或者直接拨打 7×12小时一对一咨询电话

175 2108 6175

请填写需求信息,我们会在10分钟内与您取得联系

请认真填写需求信息,我们会在10分钟内与您取得联系

×
客服二维码
咨询技术总监
175-2108-6175
客服二维码
技术总监微信
客服二维码