Https中间人攻击

https协议由 http + ssl 协议构成,具体的链接过程可参考SSL或TLS握手的概述
中间人攻击过程如下:

  • 服务器向客户端发送公钥。
  • 攻击者截获公钥,保留在自己手上。
  • 然后攻击者自己生成一个【伪造的】公钥,发给客户端。
  • 客户端收到伪造的公钥后,生成加密hash值发给服务器。
  • 攻击者获得加密hash值,用自己的私钥解密获得真秘钥。
  • 同时生成假的加密hash值,发给服务器。
  • 服务器用私钥解密获得假秘钥。
  • 服务器用加秘钥加密传输信息

防范方法:

  • 服务端在发送浏览器的公钥中加入CA证书,浏览器可以验证CA证书的有效性

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

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

1.https请求

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

2.生成公钥和私钥

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

3.返回公钥

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

4.客户端验证公钥

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

5.发送客户端密钥

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

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

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

7.加密传输

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

8.获取加密内容,解密

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

中间人劫持攻击

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

中间人截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;将服务器返回给客户端的内容发送给客户端,伪装成服务器与客户端进行通信。
通过这样的手段,便可以获取客户端和服务器之间通信的所有内容。
使用中间人攻击手段,必须要让客户端信任中间人的证书,如果客户端不信任,则这种攻击手段也无法发挥作用。

二、中间人攻击的预防

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

如volley

OKhttp3.0

预防方法:

预防方式有两种

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

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

通过预埋证书创建 SSLSocketFactory;

private static SSLSocketFactory buildSSLSocketFactory(Context context,int certRawResId) {KeyStore keyStore = null;try {keyStore = buildKeyStore(context, certRawResId);} catch (KeyStoreException e) {e.printStackTrace();} catch (CertificateException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();TrustManagerFactory tmf = null;try {tmf = TrustManagerFactory.getInstance(tmfAlgorithm);tmf.init(keyStore);} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (KeyStoreException e) {e.printStackTrace();}SSLContext sslContext = null;try {sslContext = SSLContext.getInstance("TLS");} catch (NoSuchAlgorithmException e) {e.printStackTrace();}try {sslContext.init(null, tmf.getTrustManagers(), null);} catch (KeyManagementException e) {e.printStackTrace();}return sslContext.getSocketFactory();

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

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

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

三 Webview的HTTPS安全

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

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

Https中间人攻击相关推荐

  1. HTTPS中间人攻击实验

    HTTPS中间人攻击实验 一.实验基础 1.HTTPS概述 HTTPS (全称: Hyper Text Transfer Protocol over SecureSocketLayer), 是以安全为 ...

  2. HTTPS中间人攻击实践(原理·实践)

    前言 很早以前看过HTTPS的介绍,并了解过TLS的相关细节,也相信使用HTTPS是相对安全可靠的.直到前段时间在验证https代理通道连接时,搭建了MITM环境,才发现事实并不是我想的那样.由于部分 ...

  3. HTTPS中间人攻击,HTTPS被抓包了怎么办?

    目录 一.写在前面 二.什么是中间人攻击 三.https 是绝对安全的吗 四.中间人攻击的初步了解 五.中间人攻击的深入了解 六.https 是如何防止中间人攻击的 SSL-Pinning 七.浏览器 ...

  4. HTTPS中间人攻击实践(原理·实践) 1

    前言 很早以前看过HTTPS的介绍,并了解过TLS的相关细节,也相信使用HTTPS是相对安全可靠的.直到前段时间在验证https代理通道连接时,搭建了MITM环境,才发现事实并不是我想的那样.由于部分 ...

  5. 简述HTTPS中间人攻击

    https协议由 http + ssl 协议构成,具体的链接过程可参考SSL或TLS握手的概述 中间人攻击过程如下: 服务器向客户端发送公钥. 攻击者截获公钥,保留在自己手上. 然后攻击者自己生成一个 ...

  6. 面试题目总结(1) https中间人攻击,ConcurrentHashMap的原理 ,serialVersionUID常量,redis单线程,

    1.HTTPS协议中间人攻击是什么? https是 对http内容的加密,中间人攻击是指攻击者通过与客户端和客户端的目标服务器同时建立连接,作为客户端和服务器的桥梁,处理双方的数据,整个会话期间的内容 ...

  7. 中间人攻击HTTPS可行性分析

    我们在做内网渗透的时候,往往通过ARP投毒.DNS欺骗.会话劫持等来发起中间人攻击(MITM).利用这些手段攻击HTTP协议的网站简直易如反掌.但是现在几乎所有的网站都已经升级为更加安全的HTTPS协 ...

  8. 抓包!抓包! HTTPS中间人抓包

    简介 抓包是一种网络分析技术,可以用于捕获和分析数据包,通常用于网络故障排查.协议分析.安全审计等.网络上所有的数据包都是以二进制的形式在网络上传输的,抓包工具可以捕获到这些数据包并将其转换为可读的格 ...

  9. 老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:leapmie 来源:https://urlify.cn/z ...

最新文章

  1. WebBrowser 打印设置,打印预览,去页眉和页脚
  2. 来自 Facebook 内部的 Python 学习知识图谱,太全了!
  3. 41. 缺失的第一个正数 golang
  4. 【C语言】第四章 逻辑判断与选择结构 题解
  5. HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容
  6. 以FORWARD为例,分步骤演示Filter对转发请求的拦截效果
  7. 全球首发!惯性导航导论(剑桥大学)第六部分
  8. 已收藏!java面试知识点整理
  9. 计数显示器c语言程序,51单片机计数显示器Proteus仿真程序
  10. X-Scan使用教程
  11. Adobe DreamweaverCS4 beta+可用序列号,FireworkCS4 beta及SoundboothCS4 beta 官方下载地址...
  12. ImportError: Couldn‘t import Django. Are you sure it‘s installed and available on your PYTHONPATH en
  13. 【推荐】数据治理资料合集
  14. uniapp 微信小程序 弹窗 用户授权
  15. 最新QQ坦白说消息查看发送者
  16. 读《弗洛伊德:作家与白日梦》
  17. Java随笔记 - 实现一个自定义的BitMap
  18. 养胃有道——送给胃不好的人 (转)
  19. strchr()函数的详解与实现
  20. 界面组件Kendo UI for React R3 2022新版,让Web应用更酷炫

热门文章

  1. 华为鸿蒙系统手机开机,抓紧感受下,华为鸿蒙手机端开机界面确认
  2. MathNet.Numerics
  3. python3 queue的多线程通信
  4. 【论文阅读】BPR: Bayesian personalized ranking from implicit feedback
  5. SpringBoot2.X 中文配置参考指南
  6. 徽杭古道路线图旅游攻略
  7. 如何无损截取多个视频画面
  8. 李宏毅_Machine Learning_1
  9. mac常见问题(三) macbook键盘溅上水怎么办?
  10. Unity 让物体同时播放两种动画