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,但是出了问题,没 ...
随机推荐
- 搭建web攻防环境
提示:本实验仅用于学习参考,不可用作其他用途! 任务一.基于centos7搭建dvwa web服务靶机 在centos7安装LAMP并启动,访问phpinfo页面 从互联网下载dvwa并解压到/var ...
- 一文掌握XSS
目录 XSS跨站脚本攻击 1.什么叫跨站脚本攻击? 2.XSS跨站脚本攻击的原理 3.XSS跨站脚本攻击的目的是什么? 4.XSS跨站脚本攻击出现的原因 5.XSS跨站脚本攻击的条件 1.有输入有输出 ...
- java.util.Collections
p.p1 { margin: 0; font: 11px Monaco } span.s1 { text-decoration: underline } span.s2 { color: rgba(1 ...
- java 深拷贝与浅拷贝机制详解
概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定义的clone方法为深拷贝. (一 ...
- three.js 显示中文字体 和 tween应用
今天郭先生说一下如何在three中显示中文字体,然后结合tween实现文字位置的动画.线案例请点击博客原文. 1. 生成中文字体 我们都使用过three.js的FontLoader加载typeface ...
- 循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志
在一个系统的权限管理模块中,一般都需要跟踪一些具体的日志,ABP框架的系统的日志管理,包括登录日志.接口访问日志.实体变化历史日志,本篇随笔介绍ABP框架中这些日志的管理和界面处理. 1.系统登录日志 ...
- 第二章 信号量及条件变量(三)——> 重点
2.4.4 信号量的应用 1. 利用信号量实现进程互斥 为使多个进程能互斥的访问某临界资源,只需为该资源设置一个互斥信号量mutex,并设置其初值为 1 ,然后讲个进程访问该资源的临界区CS置于w ...
- Logstash学习之路(五)使用Logstash抽取mysql数据到kakfa
一.Logstash对接kafka测通 说明: 由于我这里kafka是伪分布式,且kafka在伪分布式下,已经集成了zookeeper. 1.先将zk启动,如果是在伪分布式下,kafka已经集成了zk ...
- Hbase性能调优(二)
一.HBase关键参数配置指导 如果同时存在读和写的操作,这两种操作的性能会相互影响.如果写入导致的flush和Compaction操作频繁发生,会占用大量的磁盘IO操作,从而影响读取的性能.如果写入 ...
- 有序矩阵中第k小元素
有序矩阵中第k小元素 题目: 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 看到有序就会想 ...
