TLS是如何保障数据传输安全(中间人攻击)

前言

前段时间和同事讨论HTTPS的工作原理,当时对这块知识原理掌握还是靠以前看了一些博客介绍,深度不够,正好我这位同事是密码学专业毕业的,结合他密码学角度对tls加解密(DH这块)的阐述,让我对这块原理有了更进一步的理解,正文开始…

今天我们讨论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-----' ]]
docert="${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-----' ]]
docert="${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();

我是正东,学的越多不知道也越多。如果决定去深究一个东西, 一定要完全搞懂, 并认真总结一篇博客让以后能在短时间拾起来 ( 因为不搞懂你很难写一篇半年后还能理解的博客 )

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

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

相关文章

除了 Python ,这些语言写的机器学习项目也很牛

全世界只有3.14 % 的人关注了数据与算法之美Python 由于本身的易用优势和强大的工具库储备&#xff0c;成为了在人工智能及其它相关科学领域中最常用的语言之一。尤其是在机器学习&#xff0c;已然是各大项目最偏爱的语言。其实除了 Python &#xff0c;也不乏有开发者用其他语…

马斯克又要搞事情,不锈钢材质的Space X“星际飞船”正式亮相

全世界只有3.14 % 的人关注了数据与算法之美近日&#xff0c;据美国科技媒体 Teslarati 报道&#xff0c;今年 Space X &#xff08;太空探索技术公司&#xff09;已经开始研发“星际飞船”&#xff08;Starship&#xff09;和 “Super Heavy”&#xff0c;而“星际飞船”则是火…

记一次 .NET 某外贸Web站 内存泄漏分析

一&#xff1a;背景 1. 讲故事上周四有位朋友加wx咨询他的程序内存存在一定程度的泄漏&#xff0c;并且无法被GC回收&#xff0c;最终机器内存耗尽&#xff0c;很尴尬。沟通下来&#xff0c;这位朋友能力还是很不错的&#xff0c;也已经做了初步的dump分析&#xff0c;发现了托…

java取整公式,Java取整函数 四舍五入函数-Go语言中文社区

简介Math类中提供了5个与取整相关的函数&#xff0c;如下所示&#xff1a;static double ceil(double a)&#xff1a;天花板函数&#xff0c;返回大于等于a的最小整数(但是以浮点数形式存储)。static double floor(double a)&#xff1a;地板函数&#xff0c;返回小于等于a的最…

这些优质的教育类公众号您知道么,非常实用!

随着新媒体的发展壮大&#xff0c;教育类微信号林林总总数不胜数&#xff0c;官方的、媒体的、学校的……让人眼花缭乱&#xff0c;不知如何选择&#xff0c;今天&#xff0c;小编要向您推荐一些优质且实用的教育类公众号&#xff0c;请大家立即关注。长按二维码&#xff0c;选…

ML.NET Cookbook:(3)如何从CSV加载包含多个列的数据?

TextLoader用于从文本文件加载数据。您需要指定什么是数据列、它们的类型以及在文本文件中的位置。当输入文件包含许多相同类型的列&#xff08;通常打算一起使用&#xff09;时&#xff0c;我们建议从一开始就将它们作为向量列进行加载&#xff1a;这样&#xff0c;数据的架构…

hdu 4267 A Simple Problem with Integers

http://acm.hdu.edu.cn/showproblem.php?pid4267 一道加强版的树状数组题&#xff0c;利用题目的关键点——除数较小&#xff0c;可以想到将除数跟余数分类&#xff0c;最多分成55种情况&#xff0c;也就是每个结点存放55个数据的的树状数组。 建树相对简单&#xff0c;遵循思…

php年月日滚动选择,Unity3d—做一个年月日选择器(Scroll Rect拖动效果优化)— 无限滚动 + 锁定元素...

[导读]最近.....废话不多说上效果图用的是UGUI我先说思路通过判断元素的位置信息来改变Hierarchy的顺序 实现无限滚动改变位置的同时也要不断的调整Content的位置防止乱跳元素锁定就是直接锁死的元素的移动范围 当只有拖动大于一定程度时最近.....废话不多说上效果图用的是UGUI…

3秒取暖,超高颜值!冬日必备的大宇取暖器

天气越来越冷了&#xff0c;在小木冷的瑟瑟发抖的时候&#xff0c;朋友推荐了一台最新款的大宇取暖器&#xff0c;本来我怕是个鸡肋。但颜值确实是小木喜欢的呀&#xff0c;我就让怕冷的朋友先用用看&#xff0c;结果惊讶了&#xff01;这产品开了一会&#xff0c;朋友的小办公…

.Net Core with 微服务 - 架构图

上一次我们简单介绍了什么是微服务&#xff08;.NET Core with 微服务 - 什么是微服务&#xff09;。介绍了微服务的来龙去脉&#xff0c;一些基础性的概念。有大佬在评论区指出说这根本不是微服务。由于本人的能力有限&#xff0c;大概也只能理解到这个层次。先不管它到底是不…

win10+tomcat+php+配置环境变量配置,Win10系统Tomcat环境变量配置方法

在Win10系统中配置Tomcat环境变量之前&#xff0c;需要先配置JAVA&#xff0c;之后就可以配置Tomcat环境了&#xff0c;网络上的教程要么太简单&#xff0c;不明觉厉&#xff0c;要么太复杂&#xff0c;笔者整理了以下思路&#xff0c;便是以下Win10系统Tomcat环境变量配置方法…

136个Python 机器学习知识点让你受益终生!

全世界只有3.14 % 的人关注了数据与算法之美如果村里通了网&#xff0c;那你一定知道【AI】人工智能。如果你会网上冲浪&#xff0c;那你一定看到过【ML】机器学习。小编在网上看到一个段子&#xff1a;ML派坐落美利坚合众山中&#xff0c;百年来武学奇才辈出&#xff0c;隐然成…

微软Build2021今日召开,共同期待VS2022+.NET6!

Microsoft Build 2021全球开发者大会将至&#xff0c;将带来什么惊喜呢&#xff1f;去年Build 2020是第一次完全线上举办的Build大会&#xff0c;是第一次完全属于开发者的大会&#xff0c;几乎所有的新产品都是属于开发者&#xff0c;开发者是唯一的主角&#xff01;今年的Bui…

Google和百度都无法替代的10大深网搜索引擎

全世界只有3.14 % 的人关注了数据与算法之美当我们想要搜索某些内容时&#xff0c;我们第一个想到的就是打开Google、百度或必应这类的搜索引擎。但针对有些内容&#xff0c;却是这些常规搜索引擎无法获取到的&#xff0c;那就是隐藏在深网的内容。据不完全统计&#xff0c;深网…

编写properties文件的Eclipse插件

2019独角兽企业重金招聘Python工程师标准>>> 分享一个不错的编写properties文件的Eclipse插件&#xff08;plugin&#xff09;&#xff0c;有了它我们在编辑一些简体中文、繁体中文等 Unicode文本时&#xff0c;就不必再使用native2ascii编码了。您可以通过Eclipse中…

php显示前60个字,DEDECMS中怎么让文章标题栏突破60个字符

DEDECMS中怎么让文章标题栏突破60个字符&#xff1f;1、使用PHPMYADMIN 修改 MYSQL数据结构CODE: ALTER TABLE dede_archives CHANGE title title VARCHAR( 250 ) [Copy to clipboard]2、打开/dede/action_article_save.php找到39行 CODE: $title cn_substr($title,60); [Copy…

数学是理工基础,如何才能令人信服?

随着科技的快速发展&#xff0c;人工智能的重要性日渐显现。而数学知识蕴含着处理智能问题的基本思想与方法&#xff0c;是理解复杂算法的必备要素。在机器学习工作流程中&#xff0c;数学与代码高度交织在一起&#xff0c;代码通常可以根据数学直观地构建&#xff0c;甚至会共…

Win7玩CF,不能全屏的解决方法...

今天用自己的本本玩CF&#xff0c;发天竟然不能全屏&#xff0c;抓狂呀&#xff01; 在网上找了下&#xff0c;解决方法如下: 打开注册表&#xff0c;定位到: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\GraphicsDrivers\Configuration\AUO183C0_01_07D9_17^773484D7596…

EFCore之增删改查

1. 连接数据库通过依赖注入配置应用程序&#xff0c;通过startup类的ConfigureService方法中的AddDbContext将EFCore添加到依赖注入容器public void ConfigureServices(IServiceCollection services) {services.AddControllers();services.AddDbContext<OpenDbContext>(o…