TSL四次握手

HTTPS 常用的密钥交换算法有两种,分别是 RSA 和 ECDHE 算法。
其中,RSA 是比较传统的密钥交换算法,它不具备前向安全的性质,因此现在很少服务器使用的。而 ECDHE 算法具有前向安全,所以被广泛使用。

1. ECDHE算法

1.1 离散对数

ECDHE 密钥协商算法是 DH 算法演进过来的,所以我们先从 DH 算法说起。
DH 算法是非对称加密算法, 因此它可以用于密钥交换,该算法的核心数学思想是离散对数。
是不是听到这个数学概念就怂了?不怕,这次不会说离散对数推到的过程,只简单提一下它的数学公式。
离散对数是「离散 + 对数」的两个数学概念的组合,所以我们先来复习一遍对数。
要说起对数,必然要说指数,因为它们是互为反函数,指数就是幂运算,对数是指数的逆运算。
举个栗子,如果以 2 作为底数,那么指数和对数运算公式,如下图所示:
在这里插入图片描述
那么对于底数为 2 的时候, 32 的对数是 5,64 的对数是 6,计算过程如下:
在这里插入图片描述
对数运算的取值是可以连续的,而离散对数的取值是不能连续的,因此也以「离散」得名,
离散对数是在对数运算的基础上加了「模运算」,也就说取余数,对应编程语言的操作符是「%」,也可以用 mod 表示。离散对数的概念如下图:
在这里插入图片描述
上图的,底数 a 和模数 p 是离散对数的公共参数,也就说是公开的,b 是真数,i 是对数。知道了对数,就可以用上面的公式计算出真数。但反过来,知道真数却很难推算出对数。
特别是当模数 p 是一个很大的质数,即使知道底数 a 和真数 b ,在现有的计算机的计算水平是几乎无法算出离散对数的,这就是 DH 算法的数学基础。

1.2 DH 算法

认识了离散对数,我们来看看 DH 算法是如何密钥交换的。
现假设小红和小明约定使用 DH 算法来交换密钥,那么基于离散对数,小红和小明需要先确定模数和底数作为算法的参数,这两个参数是公开的,用 P 和 G 来代称。
然后小红和小明各自生成一个随机整数作为私钥,双方的私钥要各自严格保管,不能泄漏,小红的私钥用 a 代称,小明的私钥用 b 代称。
现在小红和小明双方都有了 P 和 G 以及各自的私钥,于是就可以计算出公钥:
● 小红的公钥记作 A,A = G ^ a ( mod P );
● 小明的公钥记作 B,B = G ^ b ( mod P );
A 和 B 也是公开的,因为根据离散对数的原理,从真数(A 和 B)反向计算对数 a 和 b 是非常困难的,至少在现有计算机的计算能力是无法破解的,如果量子计算机出来了,那就有可能被破解,当然如果量子计算机真的出来了,那么密钥协商算法就要做大的升级了。
双方交换各自 DH 公钥后,小红手上共有 5 个数:P、G、a、A、B,小明手上也同样共有 5 个数:P、G、b、B、A。
然后小红执行运算: B ^ a ( mod P ),其结果为 K,因为离散对数的幂运算有交换律,所以小明执行运算: A ^ b ( mod P ),得到的结果也是 K。
在这里插入图片描述
这个 K 就是小红和小明之间用的对称加密密钥,可以作为会话密钥使用。
可以看到,整个密钥协商过程中,小红和小明公开了 4 个信息:P、G、A、B,其中 P、G 是算法的参数,A 和 B 是公钥,而 a、b 是双方各自保管的私钥,黑客无法获取这 2 个私钥,因此黑客只能从公开的 P、G、A、B 入手,计算出离散对数(私钥)。
前面也多次强调, 根据离散对数的原理,如果 P 是一个大数,在现有的计算机的计算能力是很难破解出 私钥 a、b 的,破解不出私钥,也就无法计算出会话密钥,因此 DH 密钥交换是安全的。

1.3 DHE 算法

根据私钥生成的方式,DH 算法分为两种实现:
● static DH 算法,这个是已经被废弃了;
● DHE 算法,现在常用的;
static DH 算法里有一方的私钥是静态的,也就说每次密钥协商的时候有一方的私钥都是一样的,一般是服务器方固定,即 a 不变,客户端的私钥则是随机生成的。
于是,DH 交换密钥时就只有客户端的公钥是变化,而服务端公钥是不变的,那么随着时间延长,黑客就会截获海量的密钥协商过程的数据,因为密钥协商的过程有些数据是公开的,黑客就可以依据这些数据暴力破解出服务器的私钥,然后就可以计算出会话密钥了,于是之前截获的加密数据会被破解,所以 static DH 算法不具备前向安全性。
既然固定一方的私钥有被破解的风险,那么干脆就让双方的私钥在每次密钥交换通信时,都是随机生成的、临时的,这个方式也就是 DHE 算法,E 全称是 ephemeral(临时性的)。
所以,即使有个牛逼的黑客破解了某一次通信过程的私钥,其他通信过程的私钥仍然是安全的,因为每个通信过程的私钥都是没有任何关系的,都是独立的,这样就保证了「前向安全」。

1.4 ECDHE 算法

DHE 算法由于计算性能不佳,因为需要做大量的乘法,为了提升 DHE 算法的性能,所以就出现了现在广泛用于密钥交换算法 —— ECDHE 算法。
ECDHE 算法是在 DHE 算法的基础上利用了 ECC 椭圆曲线特性,可以用更少的计算量计算出公钥,以及最终的会话密钥。
小红和小明使用 ECDHE 密钥交换算法的过程:
● 双方事先确定好使用哪种椭圆曲线,和曲线上的基点 G,这两个参数都是公开的;
● 双方各自随机生成一个随机数作为私钥d,并与基点 G相乘得到公钥Q(Q = dG),此时小红的公私钥为 Q1 和 d1,小明的公私钥为 Q2 和 d2;
● 双方交换各自的公钥,最后小红计算点(x1,y1) = d1Q2,小明计算点(x2,y2) = d2Q1,由于椭圆曲线上是可以满足乘法交换和结合律,所以 d1Q2 = d1d2G = d2d1G = d2Q1 ,因此双方的 x 坐标是一样的,所以它是共享密钥,也就是会话密钥。
这个过程中,双方的私钥都是随机、临时生成的,都是不公开的,即使根据公开的信息(椭圆曲线、公钥、基点 G)也是很难计算出椭圆曲线上的离散对数(私钥)。

2. ECDHE握手过程

2.1 Cipher Suite Negotiation in TLS V.1.2

In the first step, what’s often called the “client hello”, the client initiates communication and shows the server the supported cipher suites. In response, the server sends its SSL/TLS certificate over and picks its preferred ciphers from the list. It’ll then use that info to establish secure communications with the client (i.e., server hello).
What does a cipher suite look like? In TLS 1.2, every cipher suite is composed of four distinguished parts. Let’s take a common one as an example and analyze it bit by bit.
在这里插入图片描述
Image caption: An example graphic that breaks down the individual elements that comprise a cipher suite.
● Key exchange/generation algorithm. ECDHE or elliptic curve Diffie Hellman ephemeral, is an example of an algorithm the client and server will use to generate a symmetric encryption key. Other examples of key exchange algorithms include RSA, Diffie-Hellman (DH), and elliptic curve Diffie-Hellman (ECDH). We’ll learn more about those in a moment.
● Authentication/digital signature algorithm. ECDSA, or elliptic curve digital signature algorithm, is utilized by the server to create a digital signature. How? By encrypting two randoms and its pre-master secret with its private key. The client will then use the public key to verify the signature and authenticate the server. It’s a variant of the digital signature algorithm (DSA). Its key features? It’s more secure than RSA and, thanks to its shorter keys, it has a better performance.
● Data encryption/decryption ciphers. AES128-GCM, or advanced encryption standard in Galois counter mode (GCM), is a block cipher that’s used to encrypt and decrypt the data transmitted in blocks of a pre-determined size. Among other bulk ciphers we can find CHACHA20_and POLY1305, stream ciphers encrypting data bite by bite in a linear way, and older block ciphers like DES, Triple DES, and RC4.
● Data integrity/authentication. SHA256, also called secure hashing algorithm 256, creates a 256-bit digest (i.e., the fixed size value representing the content of the hashed message). It’s the method used to identify tampering or errors during data transmission and authenticate the message. SHA-256 is recommended and approved by the National Institute of Standards and Technology (NIST). Other TLS 1.2 hashing algorithms used include MD5 and SHA-1 (both deprecated) and the more recent SHA-384.

知道了 ECDHE 算法基本原理后,我们就结合实际的情况来看看。
我用 Wireshark 工具抓了用 ECDHE 密钥协商算法的 TSL 握手过程,可以看到是四次握手:
在这里插入图片描述
细心的小伙伴应该发现了,使用了 ECDHE,在 TLS 第四次握手前,客户端就已经发送了加密的 HTTP 数据,而对于 RSA 握手过程,必须要完成 TLS 四次握手,才能传输应用数据。
所以,ECDHE 相比 RSA 握手过程省去了一个消息往返的时间,这个有点「抢跑」的意思,它被称为是「TLS False Start」,跟「TCP Fast Open」有点像,都是在还没连接完全建立前,就发送了应用数据,这样便提高了传输的效率。
接下来,分析每一个 ECDHE 握手过程。

2.2 TLS 第一次握手

客户端首先会发一个「Client Hello」消息,消息里面有客户端使用的 TLS 版本号、支持的密码套件列表,以及生成的随机数(Client Random)。
在这里插入图片描述

2.3 TLS 第二次握手

服务端收到客户端的「打招呼」,同样也要回礼,会返回「Server Hello」消息,消息面有服务器确认的 TLS 版本号,也给出了一个随机数(Server Random),然后从客户端的密码套件列表选择了一个合适的密码套件。
在这里插入图片描述
不过,这次选择的密码套件就和 RSA 不一样了,我们来分析一下这次的密码套件的意思。
「 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384」
● 密钥协商算法使用 ECDHE;
● 签名算法使用 RSA;
● 握手后的通信使用 AES 对称算法,密钥长度 256 位,分组模式是 GCM;
● 摘要算法使用 SHA384;
接着,服务端为了证明自己的身份,发送「Certificate」消息,会把证书也发给客户端。
在这里插入图片描述
这一步就和 RSA 握手过程有很大到区别了,因为服务端选择了 ECDHE 密钥协商算法,所以会在发送完证书后,发送「Server Key Exchange」消息。
在这里插入图片描述
这个过程服务器做了三件事:
● 选择了名为 named_curve 的椭圆曲线,选好了椭圆曲线相当于椭圆曲线基点 G 也定好了,这些都会公开给客户端;
● 生成随机数作为服务端椭圆曲线的私钥,保留到本地;
● 根据基点 G 和私钥计算出服务端的椭圆曲线公钥,这个会公开给客户端。
为了保证这个椭圆曲线的公钥不被第三方篡改,服务端会用 RSA 签名算法给服务端的椭圆曲线公钥做个签名。
随后,就是「Server Hello Done」消息,服务端跟客户端表明:“这些就是我提供的信息,打招呼完毕”。
在这里插入图片描述
至此,TLS 两次握手就已经完成了,目前客户端和服务端通过明文共享了这几个信息:Client Random、Server Random 、使用的椭圆曲线、椭圆曲线基点 G、服务端椭圆曲线的公钥,这几个信息很重要,是后续生成会话密钥的材料。

2.4 TLS 第三次握手

客户端收到了服务端的证书后,自然要校验证书是否合法,如果证书合法,那么服务端到身份就是没问题的。校验证书到过程,会走证书链逐级验证,确认证书的真实性,再用证书的公钥验证签名,这样就能确认服务端的身份了,确认无误后,就可以继续往下走。
客户端会生成一个随机数作为客户端椭圆曲线的私钥,然后再根据服务端前面给的信息,生成客户端的椭圆曲线公钥,然后用「Client Key Exchange」消息发给服务端。
在这里插入图片描述
至此,双方都有对方的椭圆曲线公钥、自己的椭圆曲线私钥、椭圆曲线基点 G。于是,双方都就计算出点(x,y),其中 x 坐标值双方都是一样的,前面说 ECDHE 算法时候,说 x 是会话密钥,但实际应用中,x 还不是最终的会话密钥。
还记得 TLS 握手阶段,客户端和服务端都会生成了一个随机数传递给对方吗?
最终的会话密钥,就是用「客户端随机数 + 服务端随机数 + x(ECDHE 算法算出的共享密钥) 」三个材料生成的。
之所以这么麻烦,是因为 TLS 设计者不信任客户端或服务器「伪随机数」的可靠性,为了保证真正的完全随机,把三个不可靠的随机数混合起来,那么「随机」的程度就非常高了,足够让黑客计算出最终的会话密钥,安全性更高。
算好会话密钥后,客户端会发一个「Change Cipher Spec」消息,告诉服务端后续改用对称算法加密通信。
在这里插入图片描述
接着,客户端会发「Encrypted Handshake Message」消息,把之前发送的数据做一个摘要,再用对称密钥加密一下,让服务端做个验证,验证下本次生成的对称密钥是否可以正常使用。
在这里插入图片描述

2.5 TLS 第四次握手

最后,服务端也会有一个同样的操作,发「Change Cipher Spec」和「Encrypted Handshake Message」消息,如果双方都验证加密和解密没问题,那么握手正式完成。于是,就可以正常收发加密的 HTTP 请求和响应了。

3. 总结

RSA 和 ECDHE 握手过程的区别:
● RSA 密钥协商算法「不支持」前向保密,ECDHE 密钥协商算法「支持」前向保密;
● 使用了 RSA 密钥协商算法,TLS 完成四次握手后,才能进行应用数据传输,而对于 ECDHE 算法,客户端可以不用等服务端的最后一次 TLS 握手,就可以提前发出加密的 HTTP 数据,节省了一个消息的往返时间;
● 使用 ECDHE, 在 TLS 第 2 次握手中,会出现服务器端发出的「Server Key Exchange」消息,而 RSA 握手过程没有该消息;
巨人的肩膀

  1. https://zh.wikipedia.org/wiki/橢圓曲線迪菲-赫爾曼金鑰交換
  2. https://zh.wikipedia.org/wiki/椭圆曲线
  3. https://zh.wikipedia.org/wiki/迪菲-赫爾曼密鑰交換
  4. https://time.geekbang.org/column/article/148188
  5. https://zhuanlan.zhihu.com/p/106967180
  6. https://cheapsslsecurity.com/blog/what-is-tls-1-2-a-look-at-the-secure-protocol/

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

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

相关文章

重看LeakCanary

LeakCanary是我很久之前看的东西了,我当时侯对它的印象就是它可以用来检测内存泄漏,具体原理就是将弱引用对象延迟个5s然后看是否被回收,如果没有被回收,那么就说明发生了内存泄漏,其他的也没有仔细地看 现在就详细地梳理一遍这个流程: 1.L…

Linux--自定义shell

shell shell就是操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口,用户可以通过输入命令来执行各种操作,如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。 常见的Unix系统中使…

【Spring】SpringBoot 单元测试

目 录 一.什么是单元测试?二.单元测试有哪些好处?三.Spring Boot 单元测试使用单元测试的实现步骤 一.什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证的过程就叫单元…

爬虫知识--03

数据存mysql import requests from bs4 import BeautifulSoup import pymysql# 链接数据库pymysql conn pymysql.connect(userroot,password"JIAJIA",host127.0.0.1,databasecnblogs,port3306, ) cursor conn.cursor() cursor conn.cursor()# 爬数据 res request…

大模型+影像:智能手机“上春山”

这个春节假期,一首《上春山》火了。吃瓜群众热热闹闹学了一个假期的“春山学”,了解了抢占C位的各种技巧。 假期过去,开工大吉,手机行业开始抢占今年的C位。那么问题来了,今年智能手机最大的机会点在哪里?答…

Video generation models as world simulators-视频生成模型作为世界模拟器

原文地址:Video generation models as world simulators 我们探索在视频数据上进行大规模生成模型的训练。具体来说,我们联合训练文本条件扩散模型,同时处理不同持续时间、分辨率和长宽比的视频和图像。我们利用一个在视频和图像潜在编码的时…

Fiddler工具 — 21.Fiddler常用插件

Fiddler已有的功能已经够我们日常工作中使用了,为了更好的扩展Fiddler,Fiddler也是支持一些插件的安装,也支持用户自己开发插件并安装。 Fiddler插件下载地址:https://www.telerik.com/fiddler/add-ons 1、Traffic Differ Traf…

2023年的AI模型学习/部署/优化

可以的话,github上给点一个小心心,感谢观看。 LDC边缘检测的轻量级密集卷积神经网络: meiqisheng/LDC (github.com)https://github.com/meiqisheng/LDC segment-anything分割一切的图像分割算法模型: meiqisheng/segment-anyt…

pclpy KD-Tree K近邻搜索

pclpy KD-Tree K近邻搜索 一、算法原理1.KD-Tree 介绍2.原理 二、代码三、结果1.原点云2.k近邻点搜索后的点云 四、相关数据 一、算法原理 1.KD-Tree 介绍 kd 树或 k 维树是计算机科学中使用的一种数据结构,用于在具有 k 维的空间中组织一定数量的点。它是一个二叉…

SpringBoot-2.7.6基于SLF4J日志门面的日志框架切换

SpringBoot 没有强制性的日志记录依赖项,但 Commons Logging API 除外,它通常由 Spring Framework 的模块提供。 要使用 Logback,您需要将其包含在类路径中。 推荐的方法是您只需要通过启动器,这都取决于 . 对于 Web 应用程序 ,因为它可传递地依赖于日志记录启动器。 如果…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的犬种识别系统(附完整代码资源+UI界面+PyTorch代码)

摘要:本文介绍了一种基于深度学习的犬种识别系统系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果,能够准确识别图像、视频、实时视频流以及批量文件中的犬种。文章详细解释了YOLOv8算法的原理,并提供…

【RT-DETR有效改进】利用YOLOv9的GELAN模块替换RepC3结构(附轻量化版本 + 高效涨点版本 + 手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的GELAN模块来改进RT-DETR的RepC3结构,GELAN融合了CSPNet和ELAN机制同时其中利用到了RepConv在获取更多有效特征的同时在推理时专用单分支结构从而不影响推理速度,同时…

(九)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven构建ant-framework核心代码Base封装

今天重点讲解的是ant-framework核心代码Base封装过程。 因为涉及到springmvc、mybatis的集成,为了使项目编码更简洁易用,这边将基础的BASE进行封装,其中包括:BaseBean、BaseDao、BaseService、CRUD的基础封装、分页组件的封装、m…

c++ qt五子棋联网对战游戏

C qt 五子棋联网对战游戏运行环境 Qt 6.6.0 (MSVC 2019 64-bit) 代码文件编码格式 ANSI txt文件编码格式 ANSI 测试用例 服务端端口被占用 通过客户端端口被占用 通过客户端连接服务端 服务端中途断开 通过客户端连接服务端 客户端中途断开 通过服务端没有启动 客户端启动…

【电子书】云计算_大数据

资料 wx:1945423050,备注来源和目的 个人整理了一些互联网电子书 云计算_大数据 34招精通商业智能数据分析:Power BI和Tableau进阶实战.epubCloudera Hadoop大数据平台实战指南.epubDocker实战.epubDocker技术入门与实战 第2版.epubDocker技…

华为HCIP Datacom H12-831 卷23

单选题 1、某园区部署IS-IS实现网络互通,在所有IS-IS路由器的进程中配置命令flash-flood 6 max-timer-interval 100 Leve1-2,则以下关于该场景的描述,正确的是哪—项? A、若某IS-IS路由器LSDB内更新的LSP数量为5,则在100毫秒内且路由计算完成前&#…

yarn install:unable to get local issuer certificate

一、问题描述 今天在Jenkins上发布项目时,遇到一个报错: error Error: unable to get local issuer certificateat TLSSocket.onConnectSecure (node:_tls_wrap:1535:34)at TLSSocket.emit (node:events:513:28)at TLSSocket._finishInit (node:_tls_w…

Conmi的正确答案——将JAVA中maven的.m2文件夹放到D盘

系统:WIN11 1、将.m2文件夹移动到D盘 移动后: 2、创建目录链接 mklink /j "C:\Users\Administrator\.m2" "D:\.m2"至此,maven默认的jar包会加载到D盘的.m2文件夹

RisingWave最佳实践-利用Dynamic filters 和 Temporal filters 实现监控告警

心得的体会 刚过了年刚开工,闲暇之余调研了分布式SQL流处理数据库–RisingWave,本人是Flink(包括FlinkSQL和Flink DataStream API)的资深用户,但接触到RisingWave令我眼前一亮,并且拿我们生产上的监控告警…

【Docker】免费使用的腾讯云容器镜像服务

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 1、设置密码 2、登录实例&#xff08;sudo docker login xxxxxx&#xff09; 3、新建命名空间&#xff08;每个命名空…