HTTPS是怎么保证数据安全传输的?
前言
关于HTTPS的连接过程,也是老生常谈的话题了。
其中涉及到的数字证书、电子签名、SSL/TLS、对称加密、非对称加密的问题总是让人摸不清头脑,不知道怎么回答。
今天就和大家再熟悉熟悉这其中千丝万缕的关系。
确实不安全!(HTTP协议传输)
传统的HTTP传输协议,是一种明文传输协议。也就是通信过程中都没有对数据进行加密,很容易泄漏数据。
比如泄漏了重要的用户信息、被伪造数据发送、都会造成不小的问题。
所以有的朋友就想到可以自己对数据进行加密,但是这种自己加密数据的方法也存在了很多问题,比如:
不够安全。虽然数据加了密看似安全了,但是加密的密钥怎么管理呢?这是个大问题,保存在客户端?引入插件?感觉都不是什么比较好的办法,都还是有可能被破解。兼容问题。自己对数据加密,那么就要涉及到对加密算法的管理了,而加密算法是在不断发展的,而这就要求客户端和服务器端要对加密保持更新兼容,而且不能实时进行更新,需要线下更新代码逻辑。所以这也是一个比较麻烦的问题。性能问题。通过代码去加密解密这个过程也是比较耗时的,会影响到性能。
所以,在原有的HTTP协议基础之下就增加了一种协议——SSL/TLS协议,形成新的较安全的网络协议——HTTPS。
对数据进行加密~(HTTPS传输数据)
在之前的网络数据传输过程中我说过,对数据进行解析的一系列应用层的工作都是交给了浏览器和操作系统的TCP协议栈。
所以HTTPS的加密解密工作自然也就是交给了浏览器,这样就不存在上述的性能问题了。
具体怎么做的呢?用到了对称加密算法:
- 客户端用对称密钥对数据进行加密。
- 服务器端用对称密钥对数据进行解密。
有人就会问了,这不还是和刚才说到的一样吗?这个密钥怎么管理呢?
这就需要在正式传输数据之前 想办法 把这个对称密钥告诉对方了。
而这个办法就是——非对称加密。
怎么告诉对方这个对称密钥?(非对称加密)
大家都知道非对称加密是分私钥和公钥,也就是你通过公钥加密数据,然后我用私钥来解密。
私钥只有自己有,所以只有自己能解开这个数据,即使中间人拿到数据,也破解不了。
放到实际客户端服务器通信中,就是服务器端将公钥发给客户端,然后客户端拿这个公钥对 对称密钥 进行加密,并发给服务器端,只有客户端有私钥可以解这个含有对称加密的密文。用张图表示:

但是,公钥是明文传输的呀,那么中间人就可以利用这个公钥伪造数据了:

所以怎么解决呢?就需要这个消息证明他是来自真正的服务器端,拿到真正的公钥,而不是伪造的,这就需要电子签名了。
我要证明我是我!(电子签名)
电子签名其实也是一种非对称加密的用法。
它的使用方法是:
A使用私钥对数据的哈希值进行加密,这个加密后的密文就叫做签名,然后将这个密文和数据本身传输给B。
B拿到后,签名用公钥解密出来,然后和传过来数据的哈希值做比较,如果一样,就说明这个签名确实是A签的,而且只有A才可以签,因为只有A有私钥。
反应实际情况就是:
服务器端将数据,也就是我们要传的数据(公钥),用另外的私钥签名数据的哈希值,然后和数据(公钥)一起传过去。
然后客户端用另外的公钥对签名解密,如果解密数据和数据(公钥)的哈希值一致,就能证明来源正确,不是被伪造的。
但是,这个用作签名的另外的私钥和另外的公钥怎么来的呢?这就需要强大的CA来验证了。
强大的后台机构~(数字证书)
证书颁发机构(CA, Certificate Authority)即颁发数字证书的机构。是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
实际情况中,服务器会拿自己的公钥以及服务器的一些信息传给CA,然后CA会返回给服务器一个数字证书,这个证书里面包括:
- 服务器的公钥
- 签名算法
- 服务器的信息,包括主机名等。
- CA自己的私钥对这个证书的签名
然后服务器将这个证书在连接阶段传给客户端,客户端怎么验证呢?
细心的小伙伴肯定知道,每个客户端,不管是电脑、手机都有自带的系统根证书,其中就会包括服务器数字证书的签发机构。所以系统的根证书会用他们的公钥帮我们对数字证书的签名进行解密,然后和证书里面的数据哈希值进行对比,如果一样,则代表来源是正确的,数据是没有被修改的。
当然中间人也是可以通过CA申请证书的,但是证书中会有服务器的主机名,这个主机名(域名、IP)就可以验证你的来源是来源自哪个主机。
扩展一下:
其实在服务器证书和根证书中间还有一层结构:叫中级证书,我们可以任意点开一个网页,点击左上角的按钮就可以看到证书详情:

可以看到一般完整的SSL/TLS证书有三层结构:
第一层:根证书。也就是客户端自带的那些。第二层:中级证书。一般根证书是不会直接颁发服务器证书的,因为这种行为比较危险,如果发现错误颁发就很麻烦,需要涉及到跟证书的修改。所以一般会引用中间证书,根证书对中间证书进行签名,然后中间证书再对服务器证书进行签名,一层套一层。第三层:服务器证书。也就是跟我们服务器相关的这个证书了。
再来个图总结下:

兢兢业业的好伙伴️(SSL/TLS)
以上说的所有的工作都是HTTPS里面的S帮我们做的,也就是SSL/TLS协议。
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。
这个过程其实就是在传统的传输层——HTTP层,拿到数据后交给SSL层,然后进行认证、加密等操作。
而TLS是SSL的升级版,主要目标是使SSL更安全,并使协议的规范更精确和完善。
今天要说的就这么多了。
其实只说了HTTPS连接过程中的一个步骤,即数字证书的发送。
完整的连接过程下周再说吧,来不起了哈哈。下周会出一个网络问题全解的文章,期待一下~
参考
https://wetest.qq.com/lab/view/110.html
http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
https://www.zhihu.com/question/52790301
拜拜
感谢大家的阅读,有一起学习的小伙伴可以关注下我的公众号——码上积木️️
每日一个知识点,积少成多,建立知识体系架构。
这里有一群很好的Android小伙伴,欢迎大家加入~
HTTPS是怎么保证数据安全传输的?的更多相关文章
- HTTPS 是如何保证安全的?
每当我们讨论到信息安全的时候,我们最长接触到的信息加密传输的方式莫过于 HTTPS 了,当我们浏览器地址栏闪现出绿色时,就代表着这个网站支持 HTTPS 的加密信息传输方式,并且你与它的连接确实被加密 ...
- TCP协议如何保证可靠传输
TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序 重 流 拥) 校验和: 发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化.如果收到段的检 ...
- Linux系统:保证数据安全落盘
在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据.但是我们都知道,linux系统的IO路径还是很复杂的,分为很多层,每一层都可能会有buffer来加速 ...
- Linux:保证数据安全落盘
背景 在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据.但是我们都知道,linux系统的IO路径还是很复杂的,分为很多层,每一层都可能会有buffer ...
- 转载:TCP协议如何保证可靠传输
转载至:https://www.cnblogs.com/xiaokang01/p/10033267.html TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序 ...
- 渗透测试中为什么https抓包是明文传输?
网站用的是https抓包是明文传输,为什么能看到https报文的明文? https其实就是 http + SSL/TLS 两种协议的合体.http协议是应用层协议,而SSL/TLS是传输层协议. 那问 ...
- TCP 协议如何保证可靠传输
一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节,大于MTU.这个时候发送方IP层 ...
- TCP是如何保证可靠传输的
TCP 协议如何保证可靠传输 一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节 ...
- RabbitMQ系列(四)--消息如何保证可靠性传输以及幂等性
一.消息如何保证可靠性传输 1.1.可能出现消息丢失的情况 1.Producer在把Message发送Broker的过程中,因为网络问题等发生丢失,或者Message到了Broker,但是出了问题,没 ...
随机推荐
- GraduateDesign-给APP添加获取位置信息和天气预报的功能(json)
首先,我的app需要通过网络来获取当前所在的位置.这里我找到了一个json来获取本地位置信息. http://int.dpool.sina.com.cn/iplookup/iplookup.php?f ...
- maven中pom的结构介绍
1.自己的坐标 groupId-->artifactId-->version> ` 2.打包方式 jar war pom packaging-->jar/war/pom 3. ...
- 2020DevOps状态报告——平台模型:扩展DevOps的新方法
平台模型是我们在这个领域看到越来越多的方法,它源于负责产品或服务的端到端交付的产品团队的理念.如果只应用于单一的产品,或者几个产品,它的效果很好. 但如果有数百种产品或服务,把一个产品团队用于这些产品 ...
- 温故而知新--day1
温故而知新--day1 变量类型 变量是计算机存储数据的内存空间,由于计算机可以处理不同的数据,不同的数据就要定义不同的数据类型.python的数据类型很多,还可以自定义数据类型,常用的一般数据类型有 ...
- SQL操作符的优化
操作符优化 IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQ ...
- Linux调整lvm逻辑分区大小
转载自:https://www.cnblogs.com/kevingrace/p/5825963.html 个人记录一下 Linux下对lvm逻辑卷分区大小的调整(针对xfs和ext4不同文件系 ...
- 无限重置IDE过期时间插件 亲测可以使用
相信破解过IDEA的小伙伴,都知道jetbrains-agent这个工具,没错,就是那个直接拖入到开发工具界面,一键搞定,so easy的破解工具!这个工具目前已经停止更新了,尽管还有很多小伙伴在使用 ...
- docker 删除和拉取镜像
删除镜像 # docker rmi -f 镜像id # 删除指定镜像 docker rmi -f 25d5f6s564 # docker rmi -f 镜像id 镜像id # 删除多个镜像 docke ...
- ASP.NET Core错误处理中间件[2]: 开发者异常页面
<呈现错误信息>通过几个简单的实例演示了如何呈现一个错误页面,该过程由3个对应的中间件来完成.下面先介绍用来呈现开发者异常页面的DeveloperExceptionPageMiddlewa ...
- freopen函数总结
函数原型: freopen(const char * __restrict__ _Filename,const char * __restrict__ _Mode,FILE * __restrict_ ...
