Android App如何防止抓包
作者:BennuCTech 发布时间:2023-01-03 05:20:13
前言
App安全非常重要,尤其是数据安全。但是我们知道通过Charles等工具可以对App的网络请求进行抓包,如果我们的数据没有进行加密,这样这些信息就会被清除的提取出来,会被不法分子进行利用。保证数据安全有很多种方法,今天简单聊一聊如何通过简单几步防止抓包。
当我们进行网络请求的时候,一般通过URL的openConnection来建立连接,代码如下:
URLConnection conn = url.openConnection()
其实openConnection这个函数还有一个版本,可以传入一个proxy对象,代码如下:
public URLConnection openConnection(Proxy proxy)
throws java.io.IOException
这样我们通过这个函数建立连接时传入一个Proxy.NO_PROXY,即可达到防止抓包的效果,如Charles等抓包工具就无法看到我们的链接信息了,代码如下
URLConnection conn = url.openConnection(Proxy.NO_PROXY)
官方对于Proxy.NO_PROXY描述如下:
/**
* A proxy setting that represents a {@code DIRECT} connection,
* basically telling the protocol handler not to use any proxying.
* Used, for instance, to create sockets bypassing any other global
* proxy settings (like SOCKS):
* <P>
* {@code Socket s = new Socket(Proxy.NO_PROXY);}
*
*/
public final static Proxy NO_PROXY = new Proxy();
// Creates the proxy that represents a {@code DIRECT} connection.
private Proxy() {
type = Type.DIRECT;
sa = null;
}
我么可以看到NO_PROXY实际上就是type属性为DIRECT的一个Proxy对象,这个type有三种:
DIRECT
HTTP
SOCKS
官方描述如下:
public enum Type {
/**
* Represents a direct connection, or the absence of a proxy.
*/
DIRECT,
/**
* Represents proxy for high level protocols such as HTTP or FTP.
*/
HTTP,
/**
* Represents a SOCKS (V4 or V5) proxy.
*/
SOCKS
};
这样因为是直连,所以不走代理。所以Charles等工具就抓不到包了,这样一定程度上保证了数据的安全。
当然这种方式只是通过代理抓不到包,如果直接通过路由还是可以抓包的。
补充:使用证书校验
这种方式要在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 进行抓包了
来源:https://juejin.cn/post/7078077090506997767


猜你喜欢
- 前言在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败。调用远程服务失败。争抢锁失败。这些错误可能是因为网络波动造成的,等待过后重
- 经常遇到的问题在实际得开发过程中,我们经常会遇到以下场景,我们后端请求某个接口后获取到得数据,不希望将所有字段都返回给前端,那么我们需要封装
- 一、jaxb是什么 JAXB是Java Architecture for XML Bindi
- 测试代码如下: package swt_jface.demo; import org.eclipse.jface.window.Applic
- 一、CAS(Compare And Set)Compare And Set(或Compare And Swap),CAS是解决多线程并行情况
- PowerPoint幻灯片中可插入公式,用于在幻灯片放映时演示相关内容的论证、推算的依据,能有效地为演讲者提供论述的数据支撑。通过后端程序代
- 目录1、关于struts框架,下面那些说法是正确的?2、java语言中,按照一定格式生成程序的文档的工具是?3、根据下面的程序代码,哪些选项
- 写在前面的废话 下载文件,几乎是所有APP都会用到的功能!算了,还是不废话了,直接开写吧。。。 简单使用 完成
- 在实际项目当中,我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年。。。。某些网站会记录下用
- 上一节,简单讲述了 Mybatis-Plus 搭建与使用入门,这一节,简单讲一下如何使用 MP 实现多表分页。分析使用的工程,依旧是 spr
- Spring的最基本的能力就是DI,即依赖注入,或控制反转,它可以为Bean注入其依赖的其他Bean。一个Bean依赖其他Bean一般是通过
- 在C#当中,利用WebClient这个核心类,可以轻易的打造一个下载器。但是这里想要强调的是,我们用的是异步操作。所谓异步,是相对于同步的概
- 一、技术介绍线上演示地址:http://chat.breez.work实时通信(Instant Messaging,简称IM)是一个实时通信
- 在android开发中,当不满足触发条件就按返回键的时候,就要对此进行检测。尤其是当前Activity需要往前一个Activity传送消息时
- java中的字符串比较竟然不能直接用”==”!!!!而要用equals(),返回true为两字符串相等,返回false为两字符串不相等,举个
- 一、单例模式设计模式:软件设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易
- 开发项目的时候,表很多,是不可能一点点的自己去写xml ,dao文件的,这里就需要用到代码的自动生成工具了。第一步:导入jar包,当然,这之
- 添加依赖添加generatorConfig.xml文件在maven的plugins中运行mybatis-generator插件注意事项:(1
- 注意我这里用的是官方最稳定的版本3.7.1,版本之间有个别命令是有差距的!1.zkCli.sh客户端zkCli.sh可以理解成客户端,也可以
- 实践过程效果代码public partial class Form1 : Form{ public Form1()