当前位置: 首页 > 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 …...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

动态规划-1035.不相交的线-力扣(LeetCode)

一、题目解析 光看题目要求和例图&#xff0c;感觉这题好麻烦&#xff0c;直线不能相交啊&#xff0c;每个数字只属于一条连线啊等等&#xff0c;但我们结合题目所给的信息和例图的内容&#xff0c;这不就是最长公共子序列吗&#xff1f;&#xff0c;我们把最长公共子序列连线起…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录

#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...