当前位置: 首页 > news >正文

车联网安全--TLS握手过程详解

目录

1. TLS协议概述

2. 为什么要握手

2.1 Hello

2.2 协商

2.3 同意 

3.总共握了几次手?


1. TLS协议概述

车内各ECU间基于CAN的安全通讯--SecOC,想必现目前多数通信工程师们都已经搞的差不多了(不要再问FvM了);但是在车云通信时,保证数据的信息安全则常用TLS,搞懂它,加深加深运管端各自的网络安全机制理解。

TLS(Transport Layer Security)前身叫做SSL(Secure Sockets Layer),位于TCP之上,但仍旧属于传输层,作用很明确,就是为了保证车云通信时数据的CIA。

目前,TLS协议版本已经来到了1.3,具体可以搜版本号RFC 8446,在标准中详细描述了握手协议,如下图:

RFC 5246 : TLS v1.2;RFC 4346 : TLS v1.1 ; RFC 2246 TLS v1.0

那么就从最基础的通信双方如何建立连接开始,入门TLS。

2. 为什么要握手

握手这个词很形象,就像相亲双方之前互不认识,但因为家里要求见面,那首先肯定是先握手,握手成功,双方来电,接下来对话才有戏;握手失败,闲聊两句,就各回各家。

握手期间的对话就很讲究了,对话如能找到共同话题,那相亲双方就可以围绕这个话题继续进行加密通信,这也就是TLS要先握手的本质:协商出一个密钥(共同话题),让双方基于这个密钥进行加密通信。 

这个协议中定义握手消息名字也很有意思,“Hello”,包括了Client Hello和Server Hello等。

我们以TLS1.2流程为例(因为抓包只抓到TLSV1.2),总结流程如下:

我用Wireshark抓了一个和https网页沟通的包,过程和上图很像有么有?

以这个为例来具体分析分析:

2.1 Hello

第一条消息,Client(我)向Server(知乎某专栏)发送Hello请求,得到数据包如下:

该消息体现了当前TLS版本协议、会话ID、随机数1(很重要记住它)、能够使用的密码套件、压缩算法还有很多扩展内容,特别是有个server_name,就像相亲两人见面第一句一定是,你就是xxx吧?

Client打了招呼,那Server应该要进行回复,不然就没得聊了,它话很多,打一声招呼Server Hello,紧接着陆陆续续发送了自己的证书、密钥交换参数,最终以Hello Done结尾,

Server Hello

格式如下:

Server首先会进行响应,并且从Client能够使用的密码套件中选择一种,在这里,它选择了0xc02f,满足第一条消息中提供的密码套件,这条消息确认了TLS版本1.2,选择了套件,并且承诺不会压缩后续对话,注意,这里Server还传递了一个随机数2。

密码套件名字很长:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,但其实得拆开来看:

ECDHE指的是密钥交换算法 Elliptic Curve Diffie-Hellman Ephemeral,签名就使用RSA算法;

AES_128_GCM是指后续加密通信使用AES128-GCM,既定义了密钥长度,也定义了密码工作模式;SHA256就很简单了,做Hash都用它。

Server Certificate

还是以相亲为例,两人见面后的第二句话一定是:我是某某阿姨(中间人)介绍的xxx。

这句话很关键,因为相亲双方都是基于中间人的介绍,ta的介绍就像是一个证书,是相亲双方能够继续往下聊的一个前提。

但这个中间人只是双方认可的,如果需要再进一步确认信息,身份证就是最好的证明,这是最权威的机构颁发的证书。

因此,Server Certificate提供证书的目的也很明确,就是证明自己的合法身份,这条消息格式如下:

证书主要包含了如下信息:

证书里包含了一个非常关键的内容:Server的公钥,其他关于证书的问题我们后面单独再谈。

有兴趣的可以搜一搜中国电子银行网的《六问六答》。

Server Key Exchange

前面我们已经知道了,双方要写上一个密钥,使用算法为ECDHE,这个算法要求双方首先交换公钥,因此需要这条消息 Key Exchange,格式如下:

这里面包括了握手类型、算法所选曲线采用x25519、用于协商密钥的公钥,以及用上述证书中公钥对应的私钥进行的签名,算法为RSA-PSS-SHA256(这些算法填充格式之前已经聊过了)。

Server Hello Done

Hello Done的信息量很少,如下:

 就是Server告诉Client,自我介绍完毕,看你怎么回应。

事实上,通过Wireshark抓包,我们可以看到,Server回应的消息实际是在一个包内,如下图所示:

2.2 协商

在第一步里,Client收到了Server发来的证书、密钥交换的参数等等,就需要对一步一步来验证Server的身份和数据完整性,并向Server发送密钥协商的参数,同样一包中可以封装了不同的消息,如下图:

Client Key Exchange

首先Client使用CA的公钥对证书进行验签(过程暂不讲),通过后取出Server的公钥备用。

这时候Client就拥有了四个参数:自己的协商公钥、Server的协商公钥、随机数1、随机数2。

那么神奇的就来了,预协商密钥 = c_priv * s_pub = c_priv * (s_priv * G);

G是椭圆曲线的基点G,是公开的,唯有私钥是各自保护,所以Client也要把协商公钥发给Server,

Server拿到后,计算预协商密钥 = s_priv * c_pub = s_priv * (c_priv * G)。

这不就妥了吗?两边预协商密钥都一样了,这个密钥一般叫预主密钥。 

还记得之前两个随机数吗,Client和Server会使用相同算法对这三个参数进行操作,得到最终会话密钥 = Algo(随机数1 + 随机数2 + 预主密钥)

Change Cipher Spec

这个消息就是告诉Server,咱们密钥都已经协商好了,那就用它开始进行对话吧,截图如下:

Encrypted Handshake Message

这个时候就使用了协商好的对称密钥对握手消息进行加密传输,如下:

之后就是加密后的应用数据了。 

2.3 同意 

当Client发送经过对称加密的消息后,Server当然也需要进行确认,因此会回复三个消息:

New Session Ticket

该消息主要是为了快速恢复会话,防止重复握手

Change Cipher Spec 

表示Server接收到了使用协商好的共享密钥,并且确认后续都使用该密钥进行加密通话。

Encrypted Handshake Message

3.总共握了几次手?

最后总结一下, TLS建立连接时总共进行了几次握手?

第一次:Client向Server发送 Client Hello,包括协议的版本信息、密码套件、随机数(Client Random)等;

第二次:Server向Client发送 Server Hello,包括所选密码套件、协议版本、数字证书、随机数(Server Random);

第三次:Client向Server发送协商密钥的参数、更新加密协议、发送密文等;

第四次:Server向Client发送新建会话Tickets、发送密文以验证对称加解密通道;

这就是TLS的四次握手成功。

 

相关文章:

车联网安全--TLS握手过程详解

目录 1. TLS协议概述 2. 为什么要握手 2.1 Hello 2.2 协商 2.3 同意 3.总共握了几次手? 1. TLS协议概述 车内各ECU间基于CAN的安全通讯--SecOC,想必现目前多数通信工程师们都已经搞的差不多了(不要再问FvM了);…...

【python】OpenCV—Extract Horizontal and Vertical Lines—Morphology

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、参考 更多有趣的代码示例,可参考【Programming】 1、功能描述 基于 opencv-python 库,利用形态学的腐蚀和膨胀,提取图片中的水平或者竖直线条 2、代码实现 导入基本的库函数 im…...

Redis十大数据类型详解

Redis(一) 十大数据类型 redis字符串(String) string是redis最基本的类型,一个key对应一个value string类型是二进制安全的,意思是redis的string可以包含任何数据。例如说是jpg图片或者序列化对象 一个re…...

Open FPV VTX开源之betaflight配置

Open FPV VTX开源之betaflight配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充 - 飞控固件版本 1. 源由 飞控嵌入式OSD - ardupilot配置使用betaflight配套OSD图片。 Choose correct font depending on Flight Controller SW. ──> /usr/share/fonts/├──> font_btfl…...

AT32 bootloader程序与上位机程序

从8051到stm32, 从串口下载到JLINK调试,从keil到arm-none-eabi-gcc,从"Hello wrold"到通信协议,一路起来已学会很多,是时候写一下bootloader了。 基本原理 单片机代码编译完后可以生成".hex"和".bin"文件&…...

数据结构与算法之栈: LeetCode 151. 反转字符串中的单词 (Ts版)

反转字符串中的单词 https://leetcode.cn/problems/reverse-words-in-a-string/ 描述 给你一个字符串 s ,请你反转字符串中 单词 的顺序单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开 返回 单词 顺序颠倒且 单词 之间用单个空…...

使用 configparser 读取 INI 配置文件

使用 configparser 读取 INI 配置文件 适合于读取 .ini 格式的配置文件。 配置文件示例 (config.ini): [DEFAULT] host localhost port 3306 [database] user admin password secret import configparser# 创建配置解析器 config configparser.ConfigParser()# 读取配…...

idea 自动导包,并且禁止自动导 *(java.io.*)

自动导包配置 进入 idea 设置,可以按下图所示寻找位置,也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly:自动帮我们优化导入的包Optimize imports on the fly:自动去掉一些没有用到的包 禁止导…...

RK3588-NPU pytorch-image-models 模型编译测试

RK3588-NPU pytorch-image-models 模型编译测试 一.背景二.操作步骤1.下载依赖2.创建容器3.安装依赖4.创建脚本A.生成模型名列表B.生成ONNX模型C.生成RKNN模型D.批量测试脚本 一.背景 测试RK3588-NPU对https://github.com/huggingface/pytorch-image-models.git中模型的支持程…...

低代码从“产品驱动”向“场景驱动”转型,助力数字化平台构建

一、前言 在数字化时代的大潮中,从宏观层面来看,新技术的落地速度不断加快,各行各业的数字化进程呈现出如火如荼的态势。而从微观层面剖析,企业面临着行业格局快速变化、市场竞争日益激烈以及成本压力显著增强等诸多挑战。 据专…...

相加交互效应函数发布—适用于逻辑回归、cox回归、glmm模型、gee模型

在统计分析中交互作用是指某因素的作用随其他因素水平变化而变化,两因素共同作用不等于两因素单独作用之和(相加交互作用)或之积(相乘交互作用)。相互作用的评估是尺度相关的:乘法或加法。乘法尺度上的相互作用意味着两次暴露的综合效应大于(…...

用gpg和sha256验证ubuntu.iso

链接 https://ubuntu.com/tutorials/how-to-verify-ubuntuhttps://releases.ubuntu.com/jammy/ 本文是2的简明版 sha256sum介绍 sha256sum -c SHA256SUMS 2>&1这段脚本的作用是验证文件的 SHA-256 校验和。具体来说,命令的各个部分含义如下: …...

深入解析 ZooKeeper:分布式协调服务的原理与应用

1.说说 Zookeeper 是什么? ZooKeeper 是一个开源的分布式协调服务,由 Apache Software Foundation 开发维护。它为构建分布式应用程序提供了一套简单且高效的协调接口。ZooKeeper 的设计目的是为了简化分布式系统中常见的任务,例如命名、配置…...

【Rust自学】11.10. 集成测试

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.10.1. 什么是集成测试 在Rust里,集成测试完全位于被测试库的外部。集成测试调用库的方式和其他代码一样,这也…...

对当前日期进行按年、按月、按日的取值

对当前日期进行按年、按月、按日的取值。 其规则为: 按年 为当前日期到来年同一日期的前一天(2024-12-01到2025-11-30)。 按月 为当前日期到下个月的同一日期的前一天 (2024-12-01 到 2024-12-31)。 按日 为当前日…...

【Rust自学】12.2. 读取文件

12.2.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步: 接收命令行参数读…...

C++内存泄露排查

内存泄漏是指程序动态分配的内存未能及时释放,导致系统内存逐渐耗尽,最终可能造成程序崩溃或性能下降。在C中,内存泄漏通常发生在使用new或malloc等分配内存的操作时,但没有正确地使用delete或free来释放这块内存。 在日常开发过程…...

Http 响应状态码 前后端联调

http 响应状态码 :是服务器在处理HTTP请求时返回的状态信息,用于表示请求的处理结果 1xx : 信息性状态码 100 Continue: 服务器已收到请求头部,客户端应继续发送请求体。 101 Switching Protocols : 切换协议。服务器已理解客户端的请求&a…...

48_Lua错误处理

在编写Lua应用时,都可能会遇到不可预见的错误,而错误处理是确保程序稳定性和健壮性的关键环节。有效的错误处理不仅能防止程序崩溃,还能提供有用的反馈信息给开发者或最终用户,从而提高应用程序的质量。本文将详细介绍Lua中的错误处理机制。 1.错误类型 Lua中的错误类型主…...

shell脚本回顾1

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 一、 ll /tmp/size.log &>/dev/null if [ $? -eq 0 ];then cat /tmp/size.log else touch /tmp/size.log echo date > /tmp/size.log fi二、 if …...

window 显示驱动开发-如何查询视频处理功能(三)

​D3DDDICAPS_GETPROCAMPRANGE请求类型 UMD 返回指向 DXVADDI_VALUERANGE 结构的指针,该结构包含特定视频流上特定 ProcAmp 控件属性允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视频流的 ProcAmp 控件属性指定DXVADDI_QUER…...

构建Docker镜像的Dockerfile文件详解

文章目录 前言Dockerfile 案例docker build1. 基本构建2. 指定 Dockerfile 路径3. 设置构建时变量4. 不使用缓存5. 删除中间容器6. 拉取最新基础镜像7. 静默输出完整示例 docker runDockerFile 入门syntax指定构造器FROM基础镜像RUN命令注释COPY复制ENV设置环境变量EXPOSE暴露端…...

简单聊下阿里云DNS劫持事件

阿里云域名被DNS劫持事件 事件总结 根据ICANN规则,域名注册商(Verisign)认定aliyuncs.com域名下的部分网站被用于非法活动(如传播恶意软件);顶级域名DNS服务器将aliyuncs.com域名的DNS记录统一解析到shado…...

(12)-Fiddler抓包-Fiddler设置IOS手机抓包

1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Fiddler 能捕获Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。同理也可以截获iOS设备发出的请求,比如 iPhone、iPad 和 MacBook 等苹…...

多模态学习路线(2)——DL基础系列

目录 前言 一、归一化 1. Layer Normalization (LN) 2. Batch Normalization (BN) 3. Instance Normalization (IN) 4. Group Normalization (GN) 5. Root Mean Square Normalization(RMSNorm) 二、激活函数 1. Sigmoid激活函数(二分类&…...

Caliper 配置文件解析:config.yaml 和 fisco-bcos.json 附加在caliper中执行不同的合约方法

Caliper 配置文件解析:config.yaml 和 fisco-bcos.json Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO…...

【汇编逆向系列】四、函数调用包含单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型

一、汇编代码 上一节开始,讲到了很多debug编译独有的汇编方式,为了更好的区分release的编译器优化和debug的区别,从本章节开始将会提供debug和release的汇编用作对比 Debugb编译 single_double_param:00000000000000A0: F2 0F 11 44 24 08…...

uni-app学习笔记三十--request网络请求传参

request用于发起网络请求。 OBJECT 参数说明 参数名类型必填默认值说明平台差异说明urlString是开发者服务器接口地址dataObject/String/ArrayBuffer否请求的参数App 3.3.7 以下不支持 ArrayBuffer 类型headerObject否设置请求的 header,header 中不能设置 Refere…...

MTK-Android12-13 Camera2 设置默认视频画质功能实现

MTK-Android12-13 Camera2 设置默认视频画质功能实现 场景:部分客户使用自己的mipi相机安装到我们主板上,最大分辨率为1280720,但是视频画质默认的是640480。实际场景中,在默认视频分辨率情况下拍出来的视频比较模糊、预览也不清晰…...

c++ decltype关键字

decltype为类型推导关键字。 示例代码&#xff1a; // decltype也可用于函数模板编程: template<typename T, typename U> auto add(T t, U u) -> decltype(t u) {return t u; }// decltype推导函数返回类型 auto doubleNumFunc(int x) -> decltype(x * 2) {ret…...