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

标签:app,防止,抓包
0
投稿

猜你喜欢

  • Android 调用设备已有的相机应用详情

    2022-12-20 01:07:21
  • java的线程池框架及线程池的原理

    2023-11-16 22:04:51
  • 记一次springboot服务凌晨无故宕机问题的解决

    2023-07-25 04:50:23
  • Java创建线程的七种方法总结(全网最全面)

    2023-11-03 14:27:26
  • Java线程池Executor用法详解

    2022-02-13 01:21:16
  • C#中Linq查询基本操作使用实例

    2023-11-25 00:25:37
  • C# using的本质及使用详解

    2022-10-10 06:11:23
  • 详解Java面向对象编程之多态

    2023-08-28 19:17:06
  • java实现简单的小超市程序

    2023-05-17 00:04:29
  • java 代码块与静态代码块加载顺序

    2021-08-01 15:19:35
  • SpringBoot中的五种对静态资源的映射规则的实现

    2023-06-21 08:31:47
  • winform用datagridview制作课程表实例

    2023-11-24 06:08:28
  • Android如何创建自定义ActionBar

    2022-11-18 03:57:16
  • Android应用 坐标系详细介绍

    2021-06-29 08:45:00
  • Java API文档的使用方法详解

    2022-06-15 20:12:03
  • java编程题之顺时针打印矩阵

    2022-02-22 04:05:36
  • springboot使用hibernate validation对参数校验的实现方法

    2023-01-06 22:34:16
  • Java如何基于IO流实现同一文件读写操作

    2023-07-30 15:06:38
  • Java之 TreeSet的详细使用说明

    2021-08-22 14:52:22
  • c#生成随机数示例分享

    2023-10-04 06:54:50
  • asp之家 软件编程 m.aspxhome.com