HTTPS连接过程以及中间人攻击劫持

 

HTTPS连接过程以及中间人攻击劫持

目前很多应用都用webview加载H5页面,如果服务端采用的是可信CA颁发的证书,在 webView.setWebViewClient(webviewClient) 时重载 WebViewClient的onReceivedSslError() ,如果出现证书错误,直接调用handler.proceed()会忽略错误继续加载证书有问题的页面。

 

一 、HTTPS连接过程及中间人攻击原理

https协议就是http+ssl协议,如下图所示为其连接过程:

HTTPS连接过程以及中间人攻击劫持

1.https请求

客户端向服务端发送https请求;

2.生成公钥和私钥

服务端收到请求之后,生成公钥和私钥。公钥相当于是锁,私钥相当于是钥匙,只有私钥才能够打开公钥锁住的内容;

3.返回公钥

服务端将公钥(证书)返回给客户端,公钥里面包含有很多信息,比如证书的颁发机构、过期时间等等;

4.客户端验证公钥

客户端收到公钥之后,首先会验证其是否有效,如颁发机构或者过期时间等,如果发现有问题就会抛出异常,提示证书存在问题。如果没有问题,那么就生成一个随机值,作为客户端的密钥,然后用服务端的公钥加密;

5.发送客户端密钥

客户端用服务端的公钥加密密钥,然后发送给服务端。

6.服务端收取密钥,对称加密内容

服务端收到经过加密的密钥,然后用私钥将其解密,得到客户端的密钥,然后服务端把要传输的内容和客户端的密钥进行对称加密,这样除非知道密钥,否则无法知道传输的内容。

7.加密传输

服务端将经过加密的内容传输给客户端。

8.获取加密内容,解密

客户端获取加密内容后,用之前生成的密钥对其进行解密,获取到内容。

中间人劫持攻击

https也不是绝对安全的,如下图所示为中间人劫持攻击,中间人可以获取到客户端与服务器之间所有的通信内容。

HTTPS连接过程以及中间人攻击劫持

中间人截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;将服务器返回给客户端的内容发送给客户端,伪装成服务器与客户端进行通信。

通过这样的手段,便可以获取客户端和服务器之间通信的所有内容。

使用中间人攻击手段,必须要让客户端信任中间人的证书,如果客户端不信任,则这种攻击手段也无法发挥作用。

二、中间人攻击的预防

造成中间人劫持的原因是 没有对服务端证书及域名做校验或者校验不完整,为了方便,直接采用开源框架默认的校验方式进行https请求

如volley

HTTPS连接过程以及中间人攻击劫持

HTTPS连接过程以及中间人攻击劫持

OKhttp3.0

HTTPS连接过程以及中间人攻击劫持

预防方法:

预防方式有两种

1 、针对安全性要求比较高的 app,可采取客户端预埋证书的方式锁死证书,只有当客户端证书和服务端的证书完全一致的情况下才允许通信,如一些银行类的app,但这种方式面临一个问题,证书过期的问题,因证书有一定的有效期,当预埋证书过期了,只有通过强制更新或者要求用户下载证书来解决。

以volley为例:校验的实现方式如下

通过预埋证书创建 SSLSocketFactory;

 
  1. private static SSLSocketFactory buildSSLSocketFactory(Context context, 
  2.                                                       int certRawResId) { 
  3.     KeyStore keyStore = null
  4.     try { 
  5.         keyStore = buildKeyStore(context, certRawResId); 
  6.     } catch (KeyStoreException e) { 
  7.         e.printStackTrace(); 
  8.     } catch (CertificateException e) { 
  9.         e.printStackTrace(); 
  10.     } catch (NoSuchAlgorithmException e) { 
  11.         e.printStackTrace(); 
  12.     } catch (IOException e) { 
  13.         e.printStackTrace(); 
  14.     } 
  15.  
  16.     String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
  17.     TrustManagerFactory tmf = null
  18.     try { 
  19.         tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
  20.         tmf.init(keyStore); 
  21.  
  22.     } catch (NoSuchAlgorithmException e) { 
  23.         e.printStackTrace(); 
  24.     } catch (KeyStoreException e) { 
  25.         e.printStackTrace(); 
  26.     } 
  27.  
  28.     SSLContext sslContext = null
  29.     try { 
  30.         sslContext = SSLContext.getInstance("TLS"); 
  31.     } catch (NoSuchAlgorithmException e) { 
  32.         e.printStackTrace(); 
  33.     } 
  34.     try { 
  35.         sslContext.init(null, tmf.getTrustManagers(), null); 
  36.     } catch (KeyManagementException e) { 
  37.         e.printStackTrace(); 
  38.     } 
  39.  
  40.     return sslContext.getSocketFactory(); 

生成 经过ssl校验及 域名校验的connection

HTTPS连接过程以及中间人攻击劫持

HTTPS连接过程以及中间人攻击劫持

2 针对安全性要求一般的app,可采用通过校验域名,证书有效性、证书关键信息及证书链的方式

以volley为例,重写HTTPSTrustManager 中的checkServerTrusted 方法,同时开启域名强校验

三、Webview的HTTPS安全

目前很多应用都用webview加载H5页面,如果服务端采用的是可信CA颁发的证书,在 webView.setWebViewClient(webviewClient) 时重载 WebViewClient的onReceivedSslError() ,如果出现证书错误,直接调用handler.proceed()会忽略错误继续加载证书有问题的页面,如果调用handler.cancel()可以终止加载证书有问题的页面,证书出现问题了,可以提示用户风险,让用户选择加载与否,如果是需要安全级别比较高,可以直接终止页面加载,提示用户网络环境有风险:

HTTPS连接过程以及中间人攻击劫持

不建议直接用handler.proceed()。如果webview加载https需要强校验服务端证书,可以在 onPageStarted() 中用 HttpsURLConnection 强校验证书的方式来校验服务端证书,如果校验不通过停止加载网页。当然这样会拖慢网页的加载速度,需要进一步优化,具体优化的办法不在本次讨论范围,这里也不详细讲解了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RUNOOB python练习题12 找素数问题

用来练手的python 练习题,原链接 : python练习实例12 题干 : 判断101-200之间有多少个素数,并输出所有素数 源代码如下: import numpy as np bound np.arange(101,201,1) result np.array([]) for k in bound:for i in range(k):# 如果k存在不是1或…

Linux: centOS6.5 RabbitMQ

在大多数大公司,像应用服务器软件的安装、部署都是运维的事情,其实自己去尝试部署一下,也是有收获的。 有机会正好尝试了Linux下的rabbitMq安装过程,做了记录,希望有用到的人可以做下参考。 安装环境: Li…

RUNOOB python练习题13 水仙花数

用来练手的python 练习题其十三,原链接 : python练习实例13 题干 : 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",…

OsharpNS轻量级.net core快速开发框架简明入门教程-代码生成器的使用

OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. OsharpNS.Swagger使用实例(登录和授权) 1.4. Angular6的前端项目启动Osharp代码生成器的使用 2.1 生成器的使用 2.2 生…

RUNOOB python练习题 14

用来练手的python 练习题其十四,原链接 : python练习实例14 题干 : 将一个正整数分解质因数。例如:输入90,打印出90233*5。 拿到题目,我们就可以看出,首先我们需要一个函数来判断某一正整数是否为质数,然后还需要一个…

RUNOOB python练习题17

用来练手的python 练习题其十三,原链接 : python练习实例17 题干 : 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数 这个例题让我回忆起了远古的记忆,python str类的 isalpha,isspace,isdigit方法。这些方法通过比较ASC…

Centos7下使用ELK(Elasticsearch + Logstash + Kibana)搭建日志集中分析平台

Centos7下使用ELK(Elasticsearch Logstash Kibana)搭建日志集中分析平台 日志监控和分析在保障业务稳定运行时,起到了很重要的作用,不过一般情况下日志都分散在各个生产服务器,且开发人员无法登陆生产服务器&#xf…

叠数的加法与字符串 RUNOOB python练习题 18

用来练手的python 练习题其十八,原链接 : python练习实例18 题干: 求saaaaaaaaaaaa…a的值,其中a是一个数字。例如222222222222222(此时共有5个数相加),几个数相加由键盘控制 这种类型的叠数相加,让我不禁联想到了python中&…

RUNOOB python练习题19 找出1000以内的所有完数

用来练手的python 练习题,原链接 : python练习实例19 题干: 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如61+2+3.编程找出1000以内的所有完数。 首先我们要理解,什么是完数。根据百度词条&am…

RUNOOB python练习题 23 使用*号输出菱形

用来练手的python练习题,原题链接:python练习实例23 题干: 这个题目还是利用python字符串的乘法等性质,通过循环打印出我们想要的图形。 源代码如下: for i in range(4):character " " * (3-i) "*" * ((i1)*2-1)print(charact…

RUNOOB python练习题24 斐波那契数列的衍生问题

用来练手的python练习题,原题链接 : python练习实例24 题干: 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。 拿到题目观察数列,我们不难发现,…

企业邮箱服务器如何设置?

企业邮箱是邮箱服务商面向企业客户开发的邮箱系统,采取管理员机制,企业使用自己的官网域名作为邮箱地址的后缀,由管理员为员工创建邮箱空间,并分配权限。在员工办公的场景中,为了收发邮件方便,一般的都会使…

elasticsearch6.2.4 与logstash与kibana版本6.2.4搭建同步使用

解压 tar -zxvf kibana-6.2.4-linux-x86_64.tar.gz 创建快捷方式 ln -s kibana-6.2.4-linux-x86_64 kibana /app/elasticsearch/kibana/bin #端口 server.port: 5601 #主机 server.host: "10.118.182.85" #es的地址 elasticsearch.url: http://10.118.182…

RUNOOB python练习题25 递归实现阶乘

用来练手的python练习题,原题链接: python练习实例25 题干 : 求12!3!…20!的和。 题干要求我们实现一个阶乘的求和,显而易见的,我们可以使用递归来实现阶乘,再使用循环语句对这些阶乘就行求和。源代码如下: # 求阶乘 def facto…

浅析JavaScript解析赋值、浅拷贝和深拷贝的区别

文章首发于sau交流学习社区 一、赋值(Copy) 赋值是将某一数值或对象赋给某个变量的过程,分为: 1、基本数据类型:赋值,赋值之后两个变量互不影响 2、引用数据类型:赋**址**,两个变量具…

RUNOOB python练习题27 递归逆向输出字符串

用来练手的python练习题,原题链接: python练习实例27 题干: 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。 实际要实现这个功能很简单,我们只需要反向遍历字符串即可。源代码如下: def p_inverse_boucle(my_st…

ELK 6.2.4搭建

开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。 官方网站:https://www.elastic.co/products Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式&#xff…

RUNNOOB python练习题 28 递归 数列

用来练手的python练习题其28,原题链接:python练习实例28 题干: 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比…

RUNOOB python练习题29

用来练手的python练习题其29,原题链接:python练习实例29 题干 : 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 实际这个正整数无论位数,在python3中都很容易实现。源代码如下: def ent…

定时任务(Spring Cloud Task)

引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.sprin…