一直没明白的 HTTPS,今天必须让你懂了~

news2024/11/16 3:50:16

大家第一次接触 HTTPS 协议的时候是不是和我一样,非常困惑。

这玩意概念又多又繁琐。尤其是里面的公钥私钥啥的。

当时就特别想知道,为什么用公钥加密却不能用公钥解密?

看完这篇文章你会弄明白,同时还会解锁很多HTTPS里的细节知识点。

今天,我们就先从对称加密和非对称加密聊起吧。

对称加密和非对称加密

小学上课的时候,都传过小纸条吧?传纸条的时候每个拿到纸条的同学都会忍不住看一眼,毫无隐私可言

假设班花想对我表白,又不想在传的过程中让别人发现她的情意绵绵。

就会在课间十分钟里告诉我,"每个字母向左移动一位,就是我想对你说的话"。

然后在上课的时候,递出纸条,上面写了 eb tib cj。每个帮助传递纸条的同学看了之后,都暗骂“谜语人,你给我滚出哥谭镇”。

嘿嘿,你们不懂,我懂。

我拿到纸条后,将每个字母向左移动一位,得到 da sha bi

什么话,这是什么话。

坏女人想要毁我向道之心?我果断拒绝了她的表白。

现在回忆起来,感动之余,会发现,像这种,将一段大家看得懂的信息(明文)转换为另一段大家看不懂的信息(密文),其实就是加密

像这种“左移”的加密方法,其实就是所谓的秘钥。而这种加密和解密用的都是同一个秘钥的加密形式,就叫对称加密。

对称加密

那既然有对称加密,那就有非对称加密

不同点在于,非对称加密,加密和解密用到的不是同一个秘钥,而是两个不一样的秘钥,分别是公钥和私钥

非对称加密

公钥负责加密,私钥负责解密。公钥人人可得,私钥永远不泄露。

那么问题就来了。

为什么用公钥加密,却不能用公钥解密?

这其实就涉及到公钥和私钥加密的数学原理了。

说白了加密就是将一个已知的数字根据一定的规则转换变成另一个数字,以前这些数字放在一起都可读,但是经过这么一转换,就变得不可读了。

也就是说加密的本质就是 num -> x (num是已知数,x是未知数)。

比如班花操作的加一减一就是很简单的转换方式。

那我们换个复杂的,比如求余运算。

假设现在有个求余运算公式。

 

5^2 mod 7 = 25 mod 7 = x

这个公式就很简单。在已知5的2次方和7的情况下,很容易得到x=4。

但是如果我们换一下x的位置。

 

5^x mod 7 = 4

求x等于多少的时候,上面的等式能成立呢?

那就麻烦多了。

 

5^0 mod 7 = 1
5^1 mod 7 = 5
5^2 mod 7 = 4
5^3 mod 7 = 6
5^4 mod 7 = 2

虽然麻烦了一些,但还是能反推得到x=2时等式成立。

但如果上面的模数字变得巨大无比呢?

 

5^x mod 56374677648 = 4

那这时候计算机只能挨个去试才能算出。正常CPU要跑好多年才能算出来,所以可以认为算不出来

其实上面的公式就是将 5 加密成了4。如果已知x,就很容易算出等式右边的结果是4,而反过来,从4却难以反推得到出x的值是多少。因此说这样的取模算法是不可逆的

虽然取模运算是不可逆的,但是结合欧拉定理,却可以让这个公式在一定条件下变得有点“可逆”(注意是加了引号的)。

我们来看下是怎么做的。

我们将x掰成两瓣,变成p和q的乘积。

 

原文^(p*q) mod N = 原文

如果p, q, N选取得当,原文一波取模操作之后还是变回原文。

知道这个没用,但是结合欧拉定理,再经过一些我们都看不懂的推导过程,就可以将上面的公式变换成下面这样。

 

原文^(p) mod N = 密文
密文^(q) mod N = 原文

结合欧拉公式的计算过程大家感兴趣可以查查。但这里只知道结论就够了。

也就是说,知道 p就能加密,知道 q就能解密。

而这里的p就是公钥,q就是私钥

用公钥加密过的密文只有用私钥才能解密。

加密解密公式

而且更妙的是。

p和q其实在公式里位置是可以互换的,所以反过来说“用私钥加密过的密文,只有公钥才能解密”,也是ok的。而这种操作,就是常说的验证数字签名

这就像以前古装电视剧里,经常有这么个剧情,两个失散多年的亲人,各自身上带有一块碎成两瓣的玉佩。哪天他们发现两块玉佩裂痕正好可以拼在一起,那就确认了对方就是自己失散多年的好大儿。

这两块碎玉,就有点公钥和私钥的味道。

公钥和私钥的关系

原理大家知道这么多其实就够了。

看到这里,我们就能回答下面这个问题了。

为什么用公钥加密,却不能用公钥解密?

因为大数取模运算是不可逆的,因此他人无法暴力解密。但是结合欧拉定理,我们可以选取出合适的p(公钥), q(私钥), N(用于取模的大数),让原本不可逆的运算在特定情况下,变得有那么点“可逆”的味道。数学原理决定了我们用公钥加密的数据,只有私钥能解密。反过来,用私钥加密的数据,也只有公钥能解密。

从数学原理也能看出,公钥和私钥加密是安全的,但这件事情的前提是建立在"现在的计算机计算速度还不够快"这个基础上。因此,如果有一天科技变得更发达了,我们变成了更高维度的科技文明,可能现在的密文就跟明文没啥区别了。

了解了对称加密和非对称加密之后,我们就可以聊聊HTTPS的加密原理了。

HTTPS的加密原理

如果你在公司内网里做开发,并且写的代码也只对内网提供服务。那么大概率你的服务是用的HTTP协议。

但如果哪天你想让外网的朋友们也体验下你的服务功能,那就需要将服务暴露到外网,而这时候如果还是用的HTTP协议,那信息的收发就会是明文,只要有心人士在通讯链路中任意一个路由器那抓个包,就能看到你HTTP包里的内容,因此很不安全。

为了让明文,变成密文,我们需要在HTTP层之上再加一层TLS层,目的就是为了做个加密。这就成了我们常说的HTTPS。

TLS其实分为1.2和1.3版本,目前主流的还是1.2版本,我们以它为例,来看下HTTPS的连接是怎么建立的。

HTTPS 握手过程

首先是建立TCP连接,毕竟HTTP是基于TCP的应用层协议。

在TCP成功建立完协议后,就可以开始进入HTTPS的加密流程。

总的来说。整个加密流程其实分为两阶段

加密的两阶段

第一阶段是TLS四次握手,这一阶段主要是利用非对称加密的特性各种交换信息,最后得到一个"会话秘钥"。

第二阶段是则是在第一阶段的"会话秘钥"基础上,进行对称加密通信。

我们先来看下第一阶段的TLS四次握手是怎么样的。

HTTPS流程

第一次握手

  • • Client Hello:是客户端告诉服务端,它支持什么样的加密协议版本,比如 TLS1.2,使用什么样的加密套件,比如最常见的RSA,同时还给出一个客户端随机数

第二次握手

  • • Server Hello:服务端告诉客户端,服务器随机数 + 服务器证书 + 确定的加密协议版本(比如就是TLS1.2)。

第三次握手

  • • Client Key Exchange: 此时客户端再生成一个随机数,叫 pre_master_key。从第二次握手的服务器证书里取出服务器公钥,用公钥加密 pre_master_key,发给服务器。

  • • Change Cipher Spec: 客户端这边已经拥有三个随机数:客户端随机数,服务器随机数和pre_master_key,用这三个随机数进行计算得到一个"会话秘钥"。此时客户端通知服务端,后面会用这个会话秘钥进行对称机密通信。

  • • Encrypted Handshake Message:客户端会把迄今为止的通信数据内容生成一个摘要,用"会话秘钥"加密一下,发给服务器做校验,此时客户端这边的握手流程就结束了,因此也叫Finished报文

第四次握手

  • • Change Cipher Spec:服务端此时拿到客户端传来的 pre_master_key(虽然被服务器公钥加密过,但服务器有私钥,能解密获得原文),集齐三个随机数,跟客户端一样,用这三个随机数通过同样的算法获得一个"会话秘钥"。此时服务器告诉客户端,后面会用这个"会话秘钥"进行加密通信。

  • • Encrypted Handshake Message:跟客户端的操作一样,将迄今为止的通信数据内容生成一个摘要,用"会话秘钥"加密一下,发给客户端做校验,到这里,服务端的握手流程也结束了,因此这也叫Finished报文

短短几次握手,里面全是细节,没有一处是多余的。

我们一个个来解释。

因为大家肯定已经很晕了,所以我会尽量用简短的语句,来解释下面几个问题。

HTTPS到底是对称加密还是非对称机密?

都用到了。前期4次握手,本质上就是在利用非对称加密的特点,交换三个随机数。

目的就是为了最后用这三个随机数生成对称加密的会话秘钥。后期就一直用对称机密的方式进行通信。

对称加密还是非对称加密

为什么不都用非对称加密呢?

因为非对称加密慢,对称加密相对来说快一些

第二次握手里的服务器证书是什么?怎么从里面取出公钥?

服务器证书,本质上是,被权威数字证书机构(CA)的私钥加密过的服务器公钥

服务器证书是什么

上面提到过,被私钥加密过的数据,是可以用公钥来解密的。而公钥是任何人都可以得到的。所以第二次握手的时候,客户端可以通过CA的公钥,来解密服务器证书,从而拿到藏在里面的服务器公钥

用CA公钥解密证书

看起来好像有点多此一举?

那么问题来了。

为什么我不能只传公钥,而要拿CA的私钥加密一次再传过去?

反过来想想,如果只传公钥,公钥就有可能会在传输的过程中就被黑客替换掉。然后第三次握手时客户端会拿着假公钥来加密第三个随机数 pre_master_key,黑客解密后自然就知道了最为关键的 pre_master_key。又因为第一和第二个随机数是公开的,因此就可以计算出"会话秘钥"。

所以需要有个办法证明客户端拿到的公钥是真正的服务器公钥,于是就拿CA的私钥去做一次加密变成服务器证书,这样客户端拿CA的公钥去解密,就能验证是不是真正的服务器公钥

那么问题又又来了

怎么去获得CA的公钥?

最容易想到的是请求CA的官网,获取公钥。但全世界要上网的人那么多,都用去请求CA官网的话,官网肯定顶不住。

考虑到能颁发证书的CA机构可不多,因此对应的CA公钥也不多,把他们直接作为配置放到操作系统或者浏览器里,这就完美解决了上面的问题。

CA公钥内置于操作系统或浏览器中

别人就拿不到你这三个随机数?

这三个随机数,两个来自客户端,一个来自服务端。第一次和第二次握手里的客户端随机数和服务端随机数,都是明文的。只要有心,大家都能拿到。

但第三个随机数 pre_master_key 则不行,因为它在客户端生成后,发给服务器之前,被服务器的公钥加密过,因此只有服务器本器才能用私钥进行解密。就算被别人拿到了,没有服务器的私钥,也无法解密出原文。

pre_master_key的加密解密

为什么要用三个随机数?而不是一个或两个?

三个随机数生成对称秘钥

看上去第三个随机数 pre_master_key才是关键,另外两个看起来可有可无?

确实,就算没有另外两个,也并不影响加密功能。之所以还要两个随机数,是因为只有单个 pre_master_key随机性不足,多次随机的情况下有可能出来的秘钥是一样的。但如果再引入两个随机数,就能大大增加"会话秘钥"的随机程度,从而保证每次HTTPS通信用的会话秘钥都是不同的。

为什么第三和第四次握手还要给个摘要?

第三和第四次握手的最后都有个 Finished报文,里面是个摘要

摘要,说白了就是对一大段文本进行一次hash操作。目的是为了确认通信过程中数据没被篡改过

第三次握手,客户端生成摘要,服务端验证,如果验证通过,说明客户端生成的数据没被篡改过,服务端后面才能放心跟客户端通信。

第四次握手,则是反过来,由服务端生成摘要,客户端来验证,验证通过了,说明服务端是可信任的。

那么问题叒来了。

为什么要hash一次而不是直接拿原文进行对比?

这是因为原文内容过长,hash之后可以让数据变短。更短意味着更小的传输成本。

摘要算法

这个过程中到底涉及了几对私钥和公钥?

两对。

服务器本身的公钥和私钥:在第二次握手中,服务器将自己的公钥(藏在数字证书里)发给客户端。第三次握手中用这个服务器公钥来加密第三个随机数 pre_master_key。服务器拿到后用自己的私钥去做解密。

CA的公钥和私钥:第二次握手中,传的数字证书里,包含了被CA的私钥加密过的服务器公钥。客户端拿到后,会用实现内置在操作系统或浏览器里的CA公钥去进行解密。

总结

  • • 大数取模运算是不可逆的,因此他人无法暴力解密。但是结合欧拉定理,我们可以选取出合适的p(公钥), q(私钥), N(用于取模的大数),让原本不可逆的运算在特定情况下,变得有那么点“可逆”的味道。数学原理决定了我们用公钥加密的数据,只有私钥能解密。反过来,用私钥加密的数据,也只有公钥能解密。

  • • HTTPS相当于HTTP+TLS,目前主流的是TLS1.2,基于TCP三次握手之后,再来TLS四次握手。

  • • TLS四次握手的过程中涉及到两对私钥和公钥。分别是服务器本身的私钥和公钥,以及CA的私钥和公钥。

  • • TLS四次握手背起来会挺难受的,建议关注三个随机数的流向,以此作为基础去理解,大概就能记下来了。

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

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

相关文章

1.所有被new出来的实例都是存放在堆里的吗?Android面经

问题: 所有被new出来的实例都是存放在堆里的吗? 相关知识点: 堆和栈、标量替换、栈上分配、逃逸分析 思考: 首先,这样问了,答案肯定是不是所有new出来的实例都存放在堆里,不然下面没法继续问了…

MODBUS转PROFINET网关在冷水机项目中应用

在电镀行业中,需要频繁用到冷水机,电镀产品在焊接过程中会产生大量的热量,这些热量若不及时散除,则有可能会导致待加工的电镀产品发生大变形,本案例的目的是通过微硬创新MODBUSRTU转PROFINET网关连接冷水机和PLC&#…

安卓玩机搞机技巧综合资源-----修复基带 改串码 基带qcn 改相关参数 终结贴

有需要了解这方面常识的友友梦可以先参阅我这几个帖子 请点击跳转 基带qcn的备份与写入相关 格机 nv报错 高通联机修改IMEI等参数的相关解析 关于高通QPST平台功能和选项的一些简单说明 基带qcn的备份与写入相关 格机 nv报错 以上几个帖子可以初步了解基带 串码等参数方面…

面试官:如何用Excel进行预测分析?这操作绝了!

【面试题】一个社交APP, 它的新增用户次日留存、7日留存、30日留存分别是52%、25%、14%。请模拟出来,每天如果日新增6万用户,那么第30天,它的日活数会达到多少?请使用Excel进行分析。【分析思路】第1日(次日)留存用户数第1日新增用…

筛选用户权限子集记录

【问题】Is there a way to use the $map operator in a regular Mongo document query (or aggregate \$match which I believe is the same thing).What I’m trying to do is thus: Given an set of sets, return the document if any of the sets is a subset of a paramet…

SpringBoot+VUE前后端分离项目学习笔记 - 【12 Vue使用路由】

整体代码结构 Manage.vue HomeView.vue改名为Manage.vue,用以管理其他view页面【通过import 】 <template><el-container style"min-height: 100vh"><el-aside :width"sideWidth px" style"box-shadow: 2px 0 6px rgb(0 21 41 / 3…

年终盘点:元宇宙产业委多项成果荣登元宇宙行业影响力榜单

在经过了2021年元宇宙概念落地和普及后&#xff0c;2022年成为元宇宙相关产业井喷式发展的一年。元宇宙产业委在2022年多项成果荣登行业影响力榜单。 2021-2022元宇宙科技传播图书影响力榜发布&#xff0c;元宇宙产业委好书上榜 2022年9月&#xff0c;两办印发《关于新时代进一…

Internet Download Manager2023最新永久版下载及功能介绍

提到下载工具&#xff0c;大多数国人映入脑海的或许是迅雷。没错&#xff0c;当今随着互联网的迅猛发展&#xff0c;不少早期积累大量用户的国内外下载工具尽显疲态&#xff0c;止步不前&#xff0c;纷纷掉队&#xff0c;如网络快车、FDM、脱兔等等。一款名叫Internet Download…

Anaconda(python)安装教程以及创建新环境

文章目录一. Anaconda简介二. Anacoda安装1. Anacondad下载2. 安装方式三.通过conda创建新的环境四.conda常用命令一. Anaconda简介 Anaconda介绍&#xff1a;开源的Python发行版本。Anaconda指的是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包…

make_shared与new

假设有这么个类&#xff1a; class A {private:int b;public:A(int c):b(c) { cout << "call constructor..." << endl;}~A() { cout << "call destructor..." << endl;}int getValue() { return b;} }; 当创建指向 A 对象的智能…

【测绘程序设计】——附合导线近似平差

附合导线(Connecting Traverse,CT)近似平差是测绘专业九大核心专业基础课——《数字地形测量学》中的重点内容,其程序设计也是测绘学子必修的课程设计之一。本文分享了测绘程序设计——附合导线近似平差(C++/MFC版),相关源代码(完整工程,包含测试数据)及使用示例(结果…

CLion开发环境的完全解析(QT开发?STM32?顺便速通cmake

文章目录下载与安装主题推荐编辑器与clang-format设置鼠标滚轮改变字体大小clang-format的使用我的 .clang-format 配置编译工具链设置编译工具链的添加与解释cmake配置项的添加与解释cmake的使用与实战常用的cmake变量&#xff08;入门&#xff09;常用的cmake命令&#xff08…

融合通信系统建设建议(华脉智联内参一)

各行业融合通信系统建设建议 让通信融合信息无阻 题记&#xff1a;目前各个行业都已建设了视频监控系统、内部电话系统、无线对讲机系统、公共广播系统、会场音频系统、视频会议系统等。这些通信系统各自解决不同的用户需求&#xff0c;随着技术的发展&#xff0c;以及融合通信…

腾讯安全连续三年列为Gartner在线反欺诈市场指南全球代表厂商

近日&#xff0c;全球研究机构Gartner发布了2022《在线反欺诈市场指南》&#xff08;Market Guide for Online Fraud Detection&#xff09;。腾讯安全凭借天御&#xff08;TenDI&#xff09;金融风控被列为全球代表性厂商&#xff0c;这也是腾讯安全连续第三次被列入该报告。随…

洛谷千题详解 | P1031 [NOIP2002 提高组] 均分纸牌【C/C++、pascal、Java语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; pascal源码&#xff1a; pascal源码2&#xff1a; Java源码&#xff1a; ------------------------------------------------…

很穷的top2农村男博士要不要嫁?

这个问题最近在知乎上面很火&#xff0c;经常能刷到&#xff0c;具体背景如下&#xff1a;我自己家也是农村的&#xff0c;家里比较穷&#xff0c;我就读的学校肯定比不上top2&#xff0c;但也还不错&#xff0c;是个C9&#xff0c;所以这个问题想和大家简单聊一下我的看法。知…

JavaScript刷LeetCode拿offer-栈相关题目

1. 栈是什么&#xff1f; 一种先进后出的数据结构&#xff1b;JavaScript没有栈的结构&#xff1b;可以用array实现栈的功能 入栈 push(x);出栈 pop(); const stack [];// 入栈 stack.push(1); stack.push(2);// 出栈 const item1 stack.pop(); const item2 stack.pop();2…

GC日志分析

1.写在前面 前段时间一位读者面了阿里&#xff0c;在二面中被问到 GC 日志分析&#xff0c;感觉回答的不是很好&#xff0c;过来找我复盘&#xff0c;大致听了他的回答&#xff0c;虽然回答出了部分&#xff0c;但是没抓到重点。 GC 日志分析算是 JVM 调优中比较难的部分&…

【python数据分析】对淘商品类母婴购物数据进行分析(含完整源码)

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 一、数据集 ​ 今天我们来看一个来着阿里云天池的数据集:淘母婴购物数据,有两个csv文件: 1、mum_baby.csv 它包含了953个孩子的生日和性别信息&#xff0c;这些信息是由淘或tian猫的消费者提供的…

足球视频AI(四)——队伍与裁判人员分类

一、基础概念 足球比赛中人员为&#xff1a;A队11人、B队11人、裁判&#xff0c;其中我们暂时不研究守门员。 需要将球场中的人员分类&#xff0c;并呈现在2D看板中。 1.1识别目标&#xff1a; 1&#xff09;球场中的白队 2&#xff09;球场中的蓝队 3&#xff09;球场中的…