[安卓网络安全]安卓SSL中间人攻击防范

这篇博客探讨了安卓应用程序在面对SSL中间人攻击时的防范措施,包括SSL劫持和SSL剥离攻击的原理。作者通过安装抓包工具Charles演示了如何抓取不校验证书的App信息,并指出App中可能存在的安全隐患,如自定义X509TrustManager和HostnameVerifier。解决方案包括使用CA机构颁发的证书或自签署服务证书,确保进行正确的证书和主机名验证,以增强HTTPS的安全性。
摘要由CSDN通过智能技术生成

前言

目前,我们在开发App的时候对Https的校验方面都比较忽略,当我们使用一些抓包工具测试的时候,即使手机不安装抓包工具的证书,也可以抓取我们Https进行劫持看见我们的明文内容会泄露用户的隐私数据,下面我就写下我的防护措施。

概念

中间人攻击原理

针对SSL的中间人攻击方式主要有两类,分别是SSL劫持攻击和SSL剥离攻击

SSL劫持攻击

SSL劫持攻击即SSL证书欺骗攻击,攻击者为了获得HTTPS传输的明文数据,需要先将自己接入到客户端和目标网站之间;在传输过程中伪造服务器的证书,将服务器的公钥替换成自己的公钥,这样,中间人就可以得到明文传输带Key1、Key2和Pre-Master-Key,从而窃取客户端和服务端的通信数据;

但是对于客户端来说,如果中间人伪造了证书,在校验证书过程中会提示证书错误,由用户选择继续操作还是返回,由于大多数用户的安全意识不强,会选择继续操作,此时,中间人就可以获取浏览器和服务器之间的通信数据

SSL剥离攻击

这种攻击方式也需要将攻击者设置为中间人,之后见HTTPS范文替换为HTTP返回给浏览器,而中间人和服务器之间仍然保持HTTPS服务器。由于HTTP是明文传输的,所以中间人可以获取客户端和服务器传输数据。

上面的内容来自《Https协议简析及中间人攻击原理》如果还需要对Https的知识理解和补充可以自行Google,这里就不多做解释了。

抓取不校验的App信息

通常我们看似做了Https,但是我们没有做一些安全措施的话,我们的数据就会暴露,下面我们来做一些测试。

安装抓包工具Charles

Charles是一个很好用的抓包工具,有很多强大的功能,不过是付费的,有30天的试用期。
这里有一个很简单的教程看了配置下就可以了《十分钟学会Charles抓包(iOS的http/https请求)
,虽然是文章是关于IOS但是Android的配置方式是一样的。

抓取信息

在这里插入图片描述
我屏蔽了一些敏感信息,可以看见我们成功的抓取了Https链接里面的明文信息,并且我没有安装抓包工具的证书,下面我们来进行分析。

为什么用了Https还能抓取明文信息?

我来展示下我在App中编写的代码:

OkHttpClient okHttpClient = new OkHttpClient();
        try {
   
            final TrustManager[] trustAllCerts = new TrustManager[]{
   new X509TrustManager() {
   
                @Override
                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] chain,
                        String authType) throws CertificateException {
   
                }

                @Override
                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] chain,
                        String authType) throws CertificateException {
   
                }

                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
   
                    return null;
                }
            }};
            final SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustAllCerts,
                    new java.security.SecureRandom());
            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext
                    .getSocketFactory();

            okHttpClient.setSslSocketFactory(sslSocketFactory);
            okHttpClient.setHostnameVerifier(new
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值