TLS是如何保障数据传输安全(中间人攻击)
前言
前段时间和同事讨论HTTPS的工作原理,当时对这块知识原理掌握还是靠以前看了一些博客介绍,深度不够,正好我这位同事是密码学专业毕业的,结合他密码学角度对tls加解密这阐述,让我对这块原理有了更进一步的理解,正文开始...
今天我们讨论2个话题
- TLS是如何保障数据传输安全的
- 中间人攻击的原理和攻防
什么是TLS
TLS(Transport Layer Security)是新的标准,旧的标准叫SSL(Secure Sockets Layer)。
不管新旧标准,他们的目的都是同一个,那就是保护数据的安全,那...究竟是怎样算保护呢?
TLS是如何保障数据传输安全的
先来说一般的情况,没有SSL的时候,客户端和服务器,之间有一个传输通道是用来传输各种数据,但!!!这个通道是透明的,也就是说,其他人可以清楚的看到客户端和服务器到底在秘密的交换什么东西,而有了SSL之后,就是从原本的透明传输通道升级成了非透明的传输通道。这样其他人就不容易的看到到底在传输什么东西了

这里不就说http和https的概念了,简单来说就是http有了ssl就升级为https。
http 就是走的透明的通道
https 就是非透明的通道
没用https会经常被网络服务商植入广告
没准你也遇到过,访问某个网站时会被植入广告诱导点击。
这就是有因为http是明文传输的,长城宽带是知道你访问的网站服务器下发的明文,自然就可以在明文中加点“东西”
达到他不可告人的目的!!

长城宽带还是比较收敛的,只会在第一次访问植入广告,后面再访问就不会植入了。
反正这种行为是绝对鄙视的!!!
SSL是怎么起作用的
既然明文传输是不行的,那么把明文进行加密传输呗。
就是客户端通过加密 传输到 服务端解密
反之
服务端加密 传输到 客户端解密
在到数据加密传输这一步之前,得首先建立安全连接通道!
SSL需要用到非对称加密的公私钥达到认证并建立连接通道。
建立安全连接通道后,在利用对称式加密对通道里所有的数据进行加解密。
听起来有点绕,没关系为了要了解整个概念,必须先了解下对称式加密和非对称式加密
对称式加密
假如说有一个加密的算法是【把字母往后移位k位,把位移后的结果以及k给对方】
所以当A想要和B说HI
A首先通过这个加密方法把HI这个词,往后移2位,就变成了JK
当B收到位移数:2 以及JK。B就可以通过位移数2 往回推成HI
这里的位移数:2 就是这个对称式加密算法的秘钥
A和B都拿到同样的秘钥2,是一个对称的概念!!
非对称式加密
那就是A和B拿到的秘钥是不同的。(上面的例子,A拿公钥,B拿私钥)
公钥和私钥一定是一组一对配对起来的。如果公钥是O 私钥是P 那么绝对OP是一组。
B先把公钥给A B手上有私钥
- 私钥(是绝对不能外泄的) 公钥是公开的
A 通过 B给的公钥进行加密变成 xx ,B收到后用自己的私钥把xx进行解密变成HI
如下图:

整个SSL的建立的步骤分为3个大项目 ,粉色标记的三个大块
- Authentication 使用非对称加密进行对服务器下发的证书认证
- Key Exchange (这里注意当采用Diffie—Hellman算法会和RSA算法的不同点)
- Encrypted Data Transfer 利用第二步的对称式加密,对数据传输进行加解密
想要更详细了解图中每一步请参阅
那些關於ssl-tls的二三事-九
注意:在公开网络中比如浏览器访问的站点,站点服务器不会要求客户端发送客户端证书,所以上图的4和5是灰色展示
下面说一下之前我误解的点
1. RAS和DH
都知道SSL用到了非对称加密,包括网上文章:

网上文章这么说对于理解是有帮助的,如果你只想了解大概没问题,但是作为程序员我们需要更加深入理解。
上面文章说的其实是针对采用RSA算法的。因为DH算法中不需要,所以不会在KeyExchange这一环节中利用非对称加密传输数据!
DH算法说白话一点,就是在教你如何“安全的”告诉对方密码而不用担心密码被窃听。
以下是擷取自wiki的DH流程簡圖:

上图中,Alice和Bob通过DH算法生成秘钥K,
其中:
- g、p是2个非私密数据;
- a、b是私密数据;
- A是根据:g、p、a算出来的非私密数据;B是根据:g、p、b算出来的非私密数据;
- 把A从a传到b,根据求K公式,b得到秘钥k;a同理;
注:
- p是一个大素数。p的位数决定了攻击者破解的难度。
- g则不需要很大,并且在一般的实践中通常是2或者5。
2. RSA对称加密算法中的秘钥(master secret)是不经过网络传输的
- Pre-master secret (PMS)
- Client’s random number
- Server’s random number
PMS是通过网络传输的这里面用到了非对称加密!
3. 容易被忽略的重要点:客户端验证服务端证书也用到了非对称加密
一般我们会给域名申请证书,最终的证书是最终用CA机构的Root根证书签发的。
每一次签发的证书,都是自己的私钥做了签名,并放在证书里。
由于CA机构也会用Root根证书签发一些中间证书,再由中间证书签发的证书去签名生成你要申请的证书.
如下图:

服务端下发也是下发一个证书链的结构,浏览器拿到后去一步步验证。但光有证书链,客户端是不能完成证书校验的,必须有一张根证书才能迭代完成签名认证,也就是说客户端必须信任根证书才能构建信任基础,那么根证书在哪儿呢?
浏览器用的[可信任证书库],
- 在 windows 平台中,微软有专门的根证书库。
- 在 Linux 平台中,软件和服务一般使用 NSS 根证书库。
- 在苹果平台中,也有专门的根证书库。
在windows操作系统中 打开cmd 输入 certmgr 就可以打开

浏览器在收到server端发来的ssl证书信息,拿到证书后验证其数字签名。具体就是,根据证书上写的CA签发机构,在浏览器内置的根证书里找到对应的公钥,用此公钥解开数字签名,得到摘要(digest,证书内容的hash值),据此验证证书的合法性。
总之一句话,CA就是神一样的存在,如果你信任神,你就应该信任这些CA。
中间人攻击(MITM )

中间人攻击,就是中间卡了一个人帮你和服务器进行数据交换。
这样就代表传输的所有数据都被这个中间人看光光。
为什么我都用SSL了。不应该都是数据加密了嘛,中间人是如何知道的?
用Fiddler来模拟下中间人攻击,要完成中间人攻击需要配置
- Fiddler会在证书信任中心安装一个它的证书
- 然后浏览器通过Fddler暴露的端口来访问目标站点

首先看下正常的证书长啥样的 如下图:

中了中间人攻击的证书是长啥样的 ,如下图

其实中间人的角色,就是充当了服务器在和你建立SSL。
所以对浏览器来说,这个中间人就是真正的服务器,只是浏览器不知情而已。
但是其实浏览器并不会那么笨,因为如上面我们讲了浏览器会去【可信任证书中心】去验证。如果遇到不存在的证书,浏览器就会出现以下的提示

客户端本身就是坏人的情况下,才会在自己的【可信任证书中心】装一个用于中间人攻击的证书。
有什么办法可以防止中间人攻击 -》 SSL Pinning
什么是SSL Pinning
SSL Pinning 也叫 Certificate Pinning
而前面有提到一個概念,公钥私钥是一对一配对的。
所以同一组公私钥出来的凭证,這個凭证里面的公钥绝对是不会变的。
而 SSL Pinning 就是要把 SSL 固定起来,这个固定就是利用公钥的特性实现的。
假设有一个APP是专门访问baidu.com的
baidu.com证书里面的公钥是O的话,而我app里面的代码,已经有预先写好O这个公钥,
所以当我的app浏览 baidu.com的时候,取得证书里面的公钥O
拿这个公钥O和代码写的O对比是否一致。如果不一致就拒绝。
为啥是中间人攻击的话,那么这2个O肯定不一致!
验证一下就知道了,下面这段脚本可以从服务端下发的证书拿到公钥
分别测试下 正常情况和中间人攻击的情况
正常情况
#!/bin/bash
certs=`openssl s_client -connect $1:443 -servername $1 -showcerts </dev/null 2>/dev/null | sed -n '/Certificate chain/,/Server certificate/p'`
rest=$certs
while [[ "$rest" =~ '-----BEGIN CERTIFICATE-----' ]]
do
cert="${rest%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
rest=${rest#*-----END CERTIFICATE-----}
echo `echo "$cert" | grep 's:' | sed 's/.*s:\(.*\)/\1/'`
echo "$cert" | openssl x509 -pubkey -noout |
openssl rsa -pubin -outform der 2>/dev/null |
openssl dgst -sha256 -binary | openssl enc -base64
done
百度的CA证书是一个证书链,如下图,分别是
//颁发者是 GlobalSign Organization Validation CA
9ncsiOH9INfRO1dZosXOLZck/Z+/ikYsRl0e+iOUmiw=
//颁发者是 DigiCert Inc
BbkOPUFIMuqBj5SBjChDvpb1ZCdk3b9ZNDWOnKRB/bo=

中间人攻击情况
需要设置 -proxy 去模拟
#!/bin/bash
certs=`openssl s_client -proxy 127.0.0.1:8888 -connect $1:443 -servername $1 -showcerts </dev/null 2>/dev/null | sed -n '/Certificate chain/,/Server certificate/p'`
rest=$certs
while [[ "$rest" =~ '-----BEGIN CERTIFICATE-----' ]]
do
cert="${rest%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
rest=${rest#*-----END CERTIFICATE-----}
echo `echo "$cert" | grep 's:' | sed 's/.*s:\(.*\)/\1/'`
echo "$cert" | openssl x509 -pubkey -noout |
openssl rsa -pubin -outform der 2>/dev/null |
openssl dgst -sha256 -binary | openssl enc -base64
done

客户端如何用代码去实现SSL Pinning
CertificatePinner certPinner = new CertificatePinner.Builder()
.add("baidu.com",
"sha256/9ncsiOH9INfRO1dZosXOLZck/Z+/ikYsRl0e+iOUmiw=")
.build();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.certificatePinner(certPinner)
.build();
TLS是如何保障数据传输安全(中间人攻击)的更多相关文章
- 小白日记53:kali渗透测试之Web渗透-SSL、TLS中间人攻击(SSLsplit,Mitmproxy,SSLstrip),拒绝服务攻击
SSL.TLS中间人攻击 SSL中间人攻击 攻击者位于客户端和服务器通信链路中 利用方法: ARP地址欺骗 修改DHCP服务器 (存在就近原则) 手动修改网关 修改DNS设置 修改HOSTS文件[高于 ...
- SSL/TLS中间人攻击
准备:kali.xp kali ip:192.168.14.157 目标ip:192.168.14.158 目标网关:192.168.14.2 使用工具:ettercap.sslstrip.arpsp ...
- 中间人攻击(MITM)姿势总结
相关学习资料 http://www.cnblogs.com/LittleHann/p/3733469.html http://www.cnblogs.com/LittleHann/p/3738141. ...
- Android安全之Https中间人攻击漏洞
Android安全之Https中间人攻击漏洞 0X01 概述 HTTPS,是一种网络安全传输协议,利用SSL/TLS来对数据包进行加密,以提供对网络服务器的身份认证,保护交换数据的隐私与完整性. ...
- HTTPS中间人攻击实践(原理·实践)
前言 很早以前看过HTTPS的介绍,并了解过TLS的相关细节,也相信使用HTTPS是相对安全可靠的.直到前段时间在验证https代理通道连接时,搭建了MITM环境,才发现事实并不是我想的那样.由于 ...
- 中间人攻击——ARP欺骗的原理、实战及防御
1.1 什么是网关 首先来简单解释一下什么是网关,网关工作在OSI七层模型中的传输层或者应用层,用于高层协议的不同网络之间的连接,简单地说,网关就好比是一个房间通向另一个房间的一扇门. 1.2 A ...
- 基于HTTPS的中间人攻击-BaseProxy
前言 在上一篇文章BaseProxy:异步http/https代理中,我介绍了自己的开源项目BaseProxy,这个项目的初衷其实是为了渗透测试,抓包改包.在知识星球中,有很多朋友问我这个项目的原理及 ...
- 谈HTTPS中间人攻击与证书校验(一)
一.前言 随着安全的普及,https通信应用越发广泛,但是由于对https不熟悉导致开发人员频繁错误的使用https,例如最常见的是未校验https证书从而导致“中间人攻击”,并且由于修复方案也一直是 ...
- 中间人攻击,HTTPS也可以被碾压
摘要: 当年12306竟然要自己安装证书... 原文:知道所有道理,真的可以为所欲为 公众号:可乐 Fundebug经授权转载,版权归原作者所有. 一.什么是MITM 中间人攻击(man-in-the ...
随机推荐
- Linux tar 使用笔记
常用语法 打包和压缩包 仅打包不压缩:tar -cvf usr.tar /usr 将 /usr 目录打包为 usr.tar 打包并以 gz 格式压缩:tar -czvf usr.tar.gz /usr ...
- 使用 Velero 跨云平台迁移集群资源到 TKE
概述 Velero 是一个非常强大的开源工具,可以安全地备份和还原,执行灾难恢复以及迁移Kubernetes群集资源和持久卷,可以在 TKE 平台上使用 Velero 备份.还原和迁移集群资源,关于如 ...
- (6)MySQL进阶篇SQL优化(MyISAM表锁)
1.MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源 (如 CPU.RAM.I/O 等)的抢占以外,数据也是一种供许多用户共享的资源.如何保证数 据并 ...
- jQuery入门看这一篇就够了
一.选择器 1.基本 名称 用法 描述 #id $("#myDiv"); 根据给定的ID匹配一个元素 element $("div"); 根据给定的元素标签名匹 ...
- Chrome扩展开发基础教程(附HelloWorld)
1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...
- redhat7.6 安装 Python 3
redhat7.6 默认安装了python2.7. 查看已安装python情况 cd / # 定位到根目录 whereis python # 查看python所在目录 /usr/bin cd /usr ...
- (十五)VMware Harbor 标签管理
1. Harbor提供两种标签用来隔离各种资源(目前只有镜像): 全局级别标签: 由系统管理员管理,用于管理整个系统的镜像.它们可以添加到任何项目下的镜像中. 项目级别标签: 由项目管理员或者系统管理 ...
- [高清文字版]R语言实战(可复制文字PDF)
电子书资源:R语言实战 书籍简介 <R语言实战>从解决实际问题入手,尽量跳脱统计学的理论阐述来讨论R语言及其应用,讲解清晰透澈,极具实用性.作者不仅高度概括了R语言的强大功能.展示了各 ...
- 如何识别自己基因组数据是哪个全基因组参考版本(Genome Reference Versions/ Genome Build)
首先在这里先感谢我们[Bio生信学习交流群]的群友和创建此群的群主[陈博士后]. 今天解决的问题是怎么查看自己的基因组数据是哪个Genome Reference Versions. 步骤: 第一步,打 ...
- Day13_64_线程的优先级
线程的调度 * 单核CPU在某一时刻只能执行一条指令,线程只有得到CPU的时间片,也就是使用权,才可以执行指令 * 在单核CPU的机器上线程不是并行运行的,而是频繁切换运行的,只有在多个CPU上线程才 ...