TLS协议

news2024/11/25 0:38:12

TLS

全称 传输层安全协议,上一代是安全套接层(SSL,不安全),用途广泛,最知名的是用于http,使http升级为https协议,最新版本为TLSv1.3(推荐使用)。
TLS通过建立客户端和服务器之间的安全通道,确保传输的数据是 机密的、经认证的和未被修改的
TLS工作在 传输层协议和应用层协议之间
TLS通过使用证书和可信证书颁发机构对服务器(或客户端)进行身份验证,从而抵御中间人攻击。

TLS设计目标

满足高效性、跨平台、可扩展和通用性。

通信两端传输的数据应该是安全的,不可伪造和篡改的。

TLS/SSL协议是标准的,任何开发者基于TLS/SSL的RFC设计规范都可以实现该协议,开发者也很容易在应用中引入TLS/SSL协议。

密码学算法是不断迭代的,随着时间的推移,会出现更安全的算法,为了保障持续的安全,TLS/SSL协议允许动态地引入新的算法。由于通信体之间环境是不一样的,协议允许双方协商出都支持的密码学算法。

解决方案必须是高效的,TLS/SSL协议涉及了很多密码学算法的运算,增加了通信延时和机器负载,但现在,有一些新的技术和解决方案在逐步提升TLS/SSL协议的效率。

TLS协议套件

TLS由多个协议组成,最主要的两个是 记录协议握手协议。记录协议定义了一种数据包格式封装来自更高层协议的数据,并将该数据发送给另一方。握手协议是TLS的 密钥协商协议

记录协议

所有数据以一系列TLS记录发送,称为TLS数据包。TLS记录协议(记录层)本质上是一个传输协议,与传输数据的含义无关;

TLS记录协议首先用于握手期间交换的数据。一旦握手完成,并且双方共享一个会话密钥,应用程序数据就会被分割成块,作为TLS记录的一部分进行传输。

报文结构

TLS记录协议的数据块最多16KB,结构如下:
第一字节表示发送的数据类型22表示握手数据,23表示加密数据,21表示告警。在TLS 1.3规范中,这个值被称为内容类型(ContentType)。
第二字节和第三字节的值被称为协议版本(Protocol Version),例如tlsv1.3这两个字节 分别设置为3和1
第四字节和第五字节表示将要作为传输的数据的长度,该整数不能大于 字节(16KB)。
其余的字节是要传输的数据(也称为有效载荷),其长度等于由记录的第四字节和第五字节编码的值。

握手协议

握手协议是TLS的核心协议,是客户端和服务器建立会话密钥以便发起安全通信的过程。
在TLS握手过程中,客户端和服务器扮演不同的角色,双方进行协商。客户端提出了一些配置(TLS版本和密码套件,优先顺序等),服务器选择要使用的配置。服务器一般遵循客户端的偏好,但也可能选择其他的配置。
大体流程如下:
客户端与服务器建立TLS连接,每次TLS会话会生成一个DH密钥对,发送给服务器支持的加密算法和客户端DH公钥,还包括32字节的随机数和可选信息(附加参数等)。

服务器端生成DH(Diffie-Hellman)密钥对,并根据服务器的DH私钥和发送过来的客户端的DH公钥计算协商的预备主密钥secret,用KDF导出主密钥keys。服务器端响应ServerHello消息,内容有:用于加密TLS记录的密码、服务器DH公钥、32字节的随机数、证书、ClientHello和ServerHello中所有消息的签名(使用与证书公钥相对应的私钥计算)、同样信息的MAC以及签名。MAC使用公共密钥计算。

客户端接收到ServerHello消息时,首先先验证证书的有效性,验证签名,计算DH的会话密钥并从中得到对称密钥,验证服务器发送的MAC。一旦完成所有验证,客户端就准备好将加密的消息发送到服务器。

密码套件

密码套件一般指几种密码学算法的组合。主要包括身份验证算法(通过证书)、密钥协商算法、加密算法或者加密模式、HMAC算法的加密基元、KDF的加密基元等等。密码套件的强度决定了TLS的安全程度,web服务器通常可以配置密码套件,如nginx等,所以现在一些https网站已经禁止使用有风险的密码套件。

TLS 1.3仅支持密码套件:TLS_AES_256_GCM_SHA384、TLS_CHACHA20_POLY1305_SHA256、TLS_AES_128_GCM_SHA256。

下面使用openssl查看支持的密码套件
openssl ciphers -V | column -t
#选取第一条结果,各列说明如下:
#第一列:数值代表密码套件的编号,每个密码套件的编号由IANA(互联网数字分配机构)定义。
#第二列:代表密码套件的名称,虽然密码套件编号是一致的,不同的TLS/SSL协议实现其使用的名称可能
是不一样的。
#第三列:表示该密码套件适用于哪个TLS/SSL版本的协议。
#第四列:表示密钥协商算法。
#第五列:表示身份验证算法。
#第六列:表示加密算法、加密模式、密钥长度。
#第七列:表示HMAC算法。其中AEAD表示采用的是AEAD加密模式(比如AES128-GCM),无须HMAC算法
    1                    2                3       4       5         6              7
#0x13,0x02  -  TLS_AES_256_GCM_SHA384  TLSv1.3  Kx=any  Au=any Enc=AESGCM(256)  Mac=AEAD
密钥块
一般来说,TLS要保证数据库的机密性和完整性,需要用到对称加密算法(相比非对称加密计算较快)和消息认证码(MAC),所以需要一组密钥,这些密钥由 主密钥使用 密钥导出函数(KDF)生成。

密钥块的 个数和密钥块的 长度都依赖于协商出来的对称加密码算法和HMAC算法,也就是由密码套件决定。

例如客户端和服务器端协商出加密算法采用AES-256-CBC,消息认证码采用HMAC,则它们必须持有相同的AES密钥、HMAC密钥、初始化向量等等,这些就称为密钥块。
主密钥和预备主密钥
主密钥由 预备主密钥生成,预备主密钥也采用 密码导出函数(KDF)转换为主密钥,预备主密钥通信双方协商(采用RSA或者DH(ECDH)算法)得出。

先使用预备主密钥转换出固定长度的主密钥,然后主密钥转换出任意数量、任意长度的密钥块。
密钥导出函数(KDF)
常见的KDF有PBKDF2、PRF等。

KDF的输入参数包含输入值和salt,如果输入值和salt是一样的,则输出也是一样的。对于通信双方来说,每一次连接的salt是变化的,但是为了保证输出结果一致,双方每次持有的salt值必须相同。

TLS1.2使用 PRF进行密码推导(TLS1.3 是用的 HKDF),它需要三个参数(secret,label,seed),其中:secret是输入,label是个固定值,seed就是salt,是一个随机值,计算过程大体如下:
P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
                             HMAC_hash(secret, A(2) + seed) +...
                             HMAC_hash(secret, A(i) + seed)
                             
PRF(secret, label, seed) = P_<hash>(secret, label + seed)

/*
 其中,A(0) = seed,A(i) = HMAC_hash(secret, A(i-1))
 hash指的是单向hash函数,如sha256等等。
 label是个固定字符串,ASCII码。
 以sha256为例,一次HMAC_sha256产生的数据为32字节。如果想得到80字节数据,则令i=3,这样会得到
 96字节数据,丢弃后16字节就可得到80字节。
*/

密钥协商

为了安全传输对称加密和MAC用的密钥块,不能再使用另一个密钥去加密这些密钥块,这会陷入加密的无限循环中,我们需要一种动态密钥,每次会话都不一样,这样也具有前向保密性。
这时候就可以使用公开密钥算法了。

每个客户端和服务器端初始化连接的时候生成 预备主密钥,每次的值都是不一样的。
预备主密钥在会话结束后(连接关闭后),会自动释放,不会持久存储。
预备主密钥必须保证是机密的,确保攻击者无法从任何手段得出预备主密钥。
RSA协商
步骤如下:
1.客户端向服务器端发起连接请求,服务器端发送RSA密钥对的公钥给客户端。
2.客户端通过 随机数生成器生成一个预备主密钥,用服务器的公钥加密并发送给服务器端。
3.服务器解密预备主密钥,如果成功解密,则预备主密钥正式生效。

RSA协商虽然步骤简洁,但是不能保证前向安全性(指由于泄露密钥导致历史数据被解密)。
DH协商
步骤如下:
1.客户端向服务器端发起连接请求。
2.服务器端生成一个RSA密钥对,并将公钥发送给客户端。
3.服务器端生成DH参数和服务器DH密钥对,用RSA私钥签名DH参数和服务器DH公钥,最后将签名值、DH参数、服务器DH公钥发送给客户端。
4.客户端通过服务器RSA的公钥验证签名,获取到DH参数和服务器DH公钥。
5.客户端通过DH参数生成客户端的DH密钥对,并将客户端DH公钥发送给服务器端。
6.客户端通过客户端DH私钥和服务器端DH公钥计算出预备主密钥。
7.服务器端接收到客户端的DH公钥,与自己的DH私钥计算出预备主密钥。
自此协商完成。
静态DH
每次会话时,服务器每次发送的DH参数和DH公钥是一样的(省去计算时间),这称为静态DH算法,它不能保证前向安全性。
动态DH
通信双方每次连接的时候,服务器通过DH参数生成的服务器DH密钥对是不一样的,在会话结束后,服务器DH密钥对也会失效,由于每次会话DH密钥不一样,所以这种方式能提供前向安全性。

TLS1.3的新特性

降级保护、单次往返握手和会话恢复。

降级保护

TLS 1.3的降级保护特性被设计为抵御降级攻击,其中攻击者迫使客户端和服务器使用比1.3更弱版本的TLS。为了执行降级攻击,攻击者通过拦截和修改ClientHello消息以告诉服务器客户端不支持TLS 1.3,迫使服务器选择较弱版本的TLS,从而其可以利用较早版本的TLS中的漏洞。

为了抵御降级攻击,TLS 1.3服务器在ServerHello消息中发送的32字节随机值中使用三种模式来标识请求的连接类型。该模式应与客户端对特定类型TLS连接的请求相匹配。如果客户端接收到错误的模式,它就知道有可能正在受到攻击。

如果客户端请求TLS 1.2连接,则32个字节中的前8个字节被设置为44 4F 57 4E 47 52 44 01,如果客户端请求TLS 1.1连接,则将它们设置为44 4F 574E 47 52 44 00。如果客户端请求TLS 1.3连接,则前8字节应该是随机的。例如,如果客户端发送了要求TLS 1.3连接的ClientHello,但是网络上的攻击者将其修改为请求TLS 1.1连接,则当客户端接收到具有错误模式的ServerHello时,将知道其发送的ClientHello消息已被修改。(攻击者不能任意修改服务器的32字节随机值,因为这个值是加密签名的。)

单次握手

在典型的TLS1.2握手中,客户端向服务器发送一些数据,等待响应,然后在发送加密消息之前发送更多数据并等待服务器的响应,延迟是两个往返时间(RTT)。而TLS1.3的握手需要一个往返时间。

会话恢复

会话恢复是一种利用在前一个会话中客户端和服务器之间交换的预共享密钥来引导新会话的方法。会话恢复带来了两个主要好处:客户端可以立即开始加密,并且不需要在后续的会话中使用证书。
首先,客户端发送一个ClientHello消息,该消息包括与服务器已经共享的密钥的标识符(预共享密钥用PSK表示),以及一个新的DH公钥。客户端还可以在该第一个消息中包括加密数据(这种数据被称为0-RTT数据)。当服务器响应ClientHello消息时,它提供MAC。客户端验证MAC,并且知道它正在与之前同一台服务器进行通信,无需进行证书验证。客户端和服务器就像普通握手协议一样执行Diffie-Hellman密钥协商,随后的消息使用依赖于PSK和新计算的Diffie-Hellman共享密钥的密钥加密。

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

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

相关文章

Vue-router的引入和安装

什么是Vue-Router&#xff1f;Vue路由器是Vue.js的官方路由器&#xff0c;它与Vue.js核心深度集成&#xff0c;使用Vue轻松构建单页应用程序变得轻而易举。功能包括&#xff1a;嵌套路线映射动态路由模块化&#xff0c;基于组件的路由器配置路由参数&#xff0c;查询&#xff0…

常用的hive sql

细节&#xff1a;sql 中有涉及到正则匹配函数的&#xff0c;要注意转义符号 因为在不同语言下正则匹配规则是否需要加转义符号是不同的&#xff0c;举例&#xff0c;regexp_replace 函数&#xff0c;在hive sql的正则匹配规则的 \d 需要前面给它加上转义符号\&#xff0c;而在j…

RocketMQ5.0.0事务消息

目录 一、事务消息概览 二、事务消息实现机制 1. 事务消息发送流程 1)&#xff1a;发送事务消息类图 2)&#xff1a;生产端发送事务消息 3)&#xff1a;Broker存储事务消息 2. 生产者提交或回滚事务消息 1)&#xff1a;生产者发送提交或回滚事务请求 2)&#xff1a;Broker处…

【谷粒学院】微信扫码支付(224~238)

224.项目第十五天内容介绍 225.课程评论实现过程分析 226.课程支付功能需求分析 1、课程支付说明 &#xff08;1&#xff09;课程分为免费课程和付费课程&#xff0c;如果是免费课程可以直接观看&#xff0c;如果是付费观看的课程&#xff0c;用户需下单支付后才可以观看 &am…

CAD轴测图怎么画?

很多新手设计师小伙伴&#xff0c;不知道CAD轴测图怎么画&#xff1f;其实很简单&#xff0c;浩辰CAD中的超级轴测功能&#xff0c;可以方便地将CAD平面图转化为轴侧图&#xff0c;是绘制管线系统图的好帮手。今天就和小编一起来看看在浩辰CAD软件中通过调用超级轴测命令来绘制…

[数据结构]:08-顺序查找(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 顺序查找实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代码。使用C引用主要是为了简化指针的使用&a…

webpack生产环境配置

3 webpack生产环境配置 由于笔记文档没有按照之前的md格式书写&#xff0c;所以排版上代码上存在问题&#x1f622;&#x1f622;&#x1f622;&#x1f622; 09 提取css成单独文件 使用下载插件 npm i mini-css-extract-plugin0.9.0 -D webpack配置此时a,b提取成单独文件,并且…

1378:最短路径(shopth)

1378&#xff1a;最短路径(shopth) 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 给出一个有向图G(V, E)&#xff0c;和一个源点v0∈V&#xff0c;请写一个程序输出v0和图G中其它顶点的最短路径。只要所有的有向环权值和都是正的&#xff0c;我们就允许图的边有…

有趣的小知识(二)浏览器内的秘密:了解Cookie基础知识

一、简介 Cookie是一种小型的文本文件&#xff0c;由Web服务器发送给Web浏览器&#xff0c;并存储在用户的计算机硬盘上。它通常用于记录用户的偏好、登录状态、购物车信息等&#xff0c;以便在用户下次访问该网站时能够提供更好的用户体验。Cookie通常包含网站的名称、Cookie的…

2023年工业自动化,机器人与控制工程国际会议(IARCE 2023)

2023年工业自动化&#xff0c;机器人与控制工程国际会议&#xff08;IARCE 2023&#xff09; 重要信息 会议网址&#xff1a;www.iarce.org 会议时间&#xff1a;2023年10月27-29日 召开地点&#xff1a;中国成都 截稿时间&#xff1a;2023年9月21日 录用通知&#xff1a;…

[创业之路-57] :商业计划书BP如何书写?总体框架!

引言&#xff1a;BP (Buiness Plan) &#xff0c;即商业计划书&#xff0c;本质上还是一份计划&#xff0c;是一份商业计划&#xff0c;即一种关于如何赚钱的计划&#xff0c;是一份通过组建公司&#xff0c;运营项目&#xff0c;进而赚钱的项目计划。什么是商业&#xff1f;商…

【计算机网络】ISO/OSI参考模型与TCP/IP模型

ISO/OSI参考模型与TCP/IP模型 一、ISO/OSI参考模型&#xff08;七层&#xff09; 一个理论模型&#xff0c;并未商用。 OSI参考模型有七层&#xff0c;自上而下分别为 应用层 &#xff1a; 所有能产生网络流量的应用程序都属于是应用层 典型协议&#xff1a;FTP&#xff08…

分布式锁详解

文章目录分布式锁是什么基于 Redis 实现分布式锁如何基于Redis实现一个简单的分布式锁为什么要给锁设置一个过期时间&#xff1f;如何实现锁的优雅续期&#xff1f;如何实现可重入锁&#xff1f;Redis 如何解决集群情况下分布式锁的可靠性&#xff1f;分布式锁是什么 java单机…

从客户端的角度来看移动端IM即时通讯的消息可靠性和送达机制

如何确保IM 不丢消息是个相对复杂的话题&#xff0c;从客户端发送数据到服务器&#xff0c;再从服务器抵达目标客户端&#xff0c;最终在 UI 成功展示&#xff0c;其间涉及的环节很多&#xff0c;这里只取其中一环「接收端如何确保消息不丢失」来探讨&#xff0c;粗略聊下我接触…

crmeb商城部署(踩坑及解决方法)

源码地址&#xff1a; https://gitee.com/ZhongBangKeJi/CRMEB 原版是PHP版&#xff0c;我也不懂PHP&#xff0c;但看到功能很全&#xff0c;而且有docker-compose的脚本可以部署&#xff0c;并且教程也很完善&#xff0c;就拿来部署试下。 所以也适用于和我一样&#xff0c;…

【NodeJs】NodeJs专题之理解企业BFF框架原理

BFF—服务于前端的后端 一、什么是BFF框架 BFF框架指的是一种逻辑分成,而非一种新技术即 Backend For Frontend&#xff08;服务于前端的后端&#xff09;&#xff0c;也就是服务器设计 API 时会考虑前端的使用&#xff0c;并在服务端直接进行业务逻辑的处理&#xff0c;又称…

每日记录自己的Android项目(一)

Jetpack之Navigation今天新创建一个项目&#xff0c;选的是这个。首先映入眼帘的是一个这样的界面。由ViewBinding绑定好XML布局和根布局和标题栏。这个应该是Navigationg里面的内容还有个字段private AppBarConfiguration appBarConfiguration;Overrideprotected void onCreat…

C# 序列化时“检测到循环引用”错误的彻底解决方案

目录 一&#xff0c;问题表现 二、没有技术含量的解决方案 三、本人彻底的解决方案 简要说明 贴代码 思路解析 思路 一&#xff0c;问题表现 示例代码如下&#xff1a; [Serializable] public class NodeTest {public NodeTest (){new List<NodeTest> ();}p…

SpringBoot之@ConfigurationProperties、@EnableConfigurationProperties

ConfigurationProperties 这个注解不仅可以为yml某个类注入还可以为第三方bean绑定属性 为yml某个类注入 只要将对应的yml类对象声明实体pojo并交给spring容器管理&#xff0c;再在类上使用ConfigurationProperties绑定对应的类名即可 涉及到两个知识点&#xff0c;这个类对…

C语言中的数据储存规则

写在开头 关于复习的相关内容其实从一开始就列出了大纲&#xff0c;但是迟迟没有开始复习&#xff0c;一方面是因为学校学业却是繁忙&#xff0c;另一方面还是内心对旧知识掌握不熟练需要再学一遍的畏惧和懒惰&#xff0c;但如今&#xff0c;复习必须开始了。今天我从C语言的最…