前言

关于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是怎么保证数据安全传输的?的更多相关文章

  1. HTTPS 是如何保证安全的?

    每当我们讨论到信息安全的时候,我们最长接触到的信息加密传输的方式莫过于 HTTPS 了,当我们浏览器地址栏闪现出绿色时,就代表着这个网站支持 HTTPS 的加密信息传输方式,并且你与它的连接确实被加密 ...

  2. TCP协议如何保证可靠传输

    TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序 重 流 拥) 校验和: 发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化.如果收到段的检 ...

  3. Linux系统:保证数据安全落盘

    在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据.但是我们都知道,linux系统的IO路径还是很复杂的,分为很多层,每一层都可能会有buffer来加速 ...

  4. Linux:保证数据安全落盘

    背景 在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据.但是我们都知道,linux系统的IO路径还是很复杂的,分为很多层,每一层都可能会有buffer ...

  5. 转载:TCP协议如何保证可靠传输

    转载至:https://www.cnblogs.com/xiaokang01/p/10033267.html TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序  ...

  6. 渗透测试中为什么https抓包是明文传输?

    网站用的是https抓包是明文传输,为什么能看到https报文的明文? https其实就是 http + SSL/TLS 两种协议的合体.http协议是应用层协议,而SSL/TLS是传输层协议. 那问 ...

  7. TCP 协议如何保证可靠传输

    一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节,大于MTU.这个时候发送方IP层 ...

  8. TCP是如何保证可靠传输的

    TCP 协议如何保证可靠传输   一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节 ...

  9. RabbitMQ系列(四)--消息如何保证可靠性传输以及幂等性

    一.消息如何保证可靠性传输 1.1.可能出现消息丢失的情况 1.Producer在把Message发送Broker的过程中,因为网络问题等发生丢失,或者Message到了Broker,但是出了问题,没 ...

随机推荐

  1. 使用 SOS 对 Linux 中运行的 .NET Core 进行问题诊断

    目录 说明 准备一个方便的学习环境 2.x 配置内容 3.x 配置内容 工具介绍 lldb sos plugin 1. attach 到进程上进行调试 2. 分析core dump文件 SOS 案例分 ...

  2. pydub "Couldn't find ffmpeg or avconv - defaulting to ffmpeg" 问题解决

    我通过 命令行安装了pydub库,运行报了如下错误 RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but ...

  3. 2. C++中的引用

    1.  引用的基本使用 作用:给变量起别名 语法:数据类型  &别名=原名 注意: 别名数据类型与原名数据类型一致. 引用必须初始化. 引用一旦初始化后,就不可以更改(只能作为一个变量的别名) ...

  4. Linux下Oracle 11G XE 安装笔记

    操作系统 [oracle@RAC02 ~]$ lsb_release -aLSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:cor ...

  5. 【SpringMVC】SpringMVC 入门

    SpringMVC 入门 文章源码 SpringMVC 基本概念 在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发.在 B/S 架构中,系统标准的三层架构包括:表现层.业务层.持久层. 表 ...

  6. 有了链路日志增强,排查Bug小意思啦!

    在工作中,相信大家最怕的一件事就是听到有人在工作群艾特你:某某功能报错啦... 然后你就得屁颠屁颠的去服务器看日志,日志量少还好点,多的话找起来太麻烦了.不太容易直接定位到关键地方. 东找找西找找,好 ...

  7. 【RAC】通过命令查看当前数据库是不是rac

    SQL> show parameter  cluster_database 如果参数中显示的是 NAME                                 TYPE        ...

  8. 关于JDK15的简单理解

    一.为什么要了解JDK15? 2020年9月15日,Oracle官方发布了JDK15版本,及时关注官方的更新动态,可以让我们在日常开发中更合理的选择更加优秀的工具方法,避免使用一些过时的或一些即将被删 ...

  9. windows下部署Grafana +prometheus平台监控

      1.Prometheus简介 Prometheus基于Golang编写,编译后的软件包,不依赖于任何的第三方依赖.用户只需要下载对应平台包,解压并且添加基本的配置即可正常启Prometheus S ...

  10. 聊聊.net应用程序的Docker镜像

    ​要在容器中运行.net应用程序,你需要在容器镜像中安装.net Framework或.net Core 运行时.这不是你需要自己管理的东西,因为微软提供的Docker镜像已经安装了运行时,你可以使用 ...