Android App 如何防止抓包

在软件开发中,常用的抓包方式有 Charles 、 Fiddler和Burp,它们通过在手机网络中添加代理的方式,然后安装信任证书,接着就可以在 App 请求的时候拿到请求数据。不过,这也可能导致一些安全问题,所以对于我们通常的处理方式是,对于线上运行的包,需要防止这些抓包手段。

1,使用无代理 Proxy.NO_PROXY

在Android开发中,大部分的App的网络请求都是基于charles 和 fiddler 来进行抓包的,对网络客户端使用无代理模式即可防止抓包,代码如下。

OkHttpClient.Builder()
            .retryOnConnectionFailure(true)
            .proxy(Proxy.NO_PROXY)
            .sslSocketFactory(ssl, trustManager)
            .build()

通常情况下上述的办法有用,但是无法防住使用 VPN 导流进行的抓包( Drony + Charles),使用VPN抓包的原理是,先将手机请求导到VPN,再对VPN的网络进行Charles的代理,绕过了对App的代理。

2,使用证书校验

此种方式可以有效的防止抓包,需要在App端嵌入证书,下面是证书校验的一些说明:
在这里插入图片描述

下面是使用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 抓包问题。不过为了安全,很多的银行类和支付类应用还会进行双证书的校验。

著有《React Native移动开发实战》1,2、《Kotlin入门与实战》《Weex跨平台开发实战》、《Flutter跨平台...

5.3k 声望
15.2k 粉丝
0 条评论
推荐阅读
Spring Boot 快速接入 ChatGPT
自从OpenAI-ChatGPT火了之后,围绕OpenAI-ChatGPT的应用的话题就层出不穷,大模型人工智能的发展是不可阻挡的趋势。lucy-chat是Java环境下快速接入OpenAI-ChatGPT大模型人工智能的Java解决方案,我们无法创造工具...

xiangzhihong1阅读 243

安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...

边城29阅读 6.4k评论 5

封面图
Nginx 一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...
早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增...

民工哥23阅读 1.1k

封面图
最好用的 python 库合集
🎈 分词 - jieba优秀的中文分词库,依靠中文词库,利用词库确定汉子之间关联的概率,形成分词结果 {代码...} 🎈 词云库 - wordcloud对数据中出现频率较高的 关键词 生成的一幅图像,予以视觉上的突出 {代码...} 🎈 ...

tiny极客11阅读 2.9k评论 2

封面图
疫情已过,2023 我的前端面试记录
顺利入职。把我最近找工作的心得记录下来。工作交接确定 lastday整理手头工作,相关对接人、交接人放文档中工作交接过渡阶段。做好被咨询者,该拉人拉人,该拉群拉群平时沟通顺畅的同事如果没有 WX 可以加一个属...

linong11阅读 441

花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

民工哥11阅读 1.1k

封面图
「持续兼容」微信H5选择照片(图片&视频)及拍照&录像
做过H5调用手机相册或者拍照的同学可能深有体会,在不同型号手机和不同的浏览器上表现各有差异,实属头疼。由于手机自带浏览器或者第三方浏览器实在太多,结合最近正在做的项目用户群体P90在微信上,文本单从兼容...

wuwhs6阅读 704

封面图

著有《React Native移动开发实战》1,2、《Kotlin入门与实战》《Weex跨平台开发实战》、《Flutter跨平台...

5.3k 声望
15.2k 粉丝
宣传栏