汽车网络信息安全技术之AUTOSAR SecOC,非常详细的学习笔记,由浅入深

本文主要是介绍汽车网络信息安全技术之AUTOSAR SecOC,非常详细的学习笔记,由浅入深,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

汽车网络信息安全技术

AUTOSAR 中SecOC与其他模块的交互

详细SecOC通讯过程图

安全报文介绍

新鲜度值

新鲜度值的构成:基于同步的复合Counter

新鲜度值的管理

新鲜度值中每个计数器详解

新鲜度值的构建

发送节点:

接收节点:

1. Latest value = Received value

2. Latest value - 1 = Received value

3. Latest value + 1 = Received value

接受节点新鲜度值构造总结

FVM与SecOC的交互关系

AUTOSAR中的安全解决方案

Secured IPdu的创建

IPdu的验证

附录

FVM 接口

SecOC适配接口

安全报文发送时序图

安全报文的接收时序图

新鲜值处理时序图


汽车网络信息安全技术

下图很好的展示了目前我们智能汽车上的一些主流的网络安全的技术。我在后面会写一些学习笔记,一一讲一下这些网络安全技术。

今天我们主要关注一下 SecOC。

AUTOSAR 中SecOC与其他模块的交互

SecOC是在AUTOSAR软件包中添加的信息安全组件,该特性增加了加解密运算,密钥管理,新鲜值管理和分发等一系列功能和新要求。SecOC模块在PDU级别上为关键数据提供有效可行的身份验证机制。

Figure 1 展示了SecOC模块在Autosar 里面和其他模块的交互:
PduR负责将进出安全相关的I-PDU路由到SecOC模块。
SecOC模块随后添加安全相关信息,并将结果以I-PDU的形式传播回PduR。
然后,PduR负责进一步路由I-PDU。
此外,SecOC模块利用CSM(Crypto Service Manager)提供的加密服务并与Rte交互以允许密钥和计数器管理。
Note:CSM具体怎么调用底层加密模块,提供加密服务,可以看我另外一篇文章笔记,有详细解释及代码展示: Autosar CyberSecurity之CSM, CryIf,Crypto Driver学习笔记,由浅入深详细,理论讲解软件配置_爱思考的发菜_汽车网络信息安全的博客-CSDN博客
或者
Autosar CyberSecurity之HSM和CSM, CryIf,Crypto Driver之间的关系,科普分享,理论讲解软件配置_爱思考的发菜_汽车网络信息安全的博客-CSDN博客

详细SecOC通讯过程图

先来看一张整个SecOC通信加密的流程图,后面会详细解释:

从这张图中,我们可以总结出SecOC功能的核心就是“安全报文”:

1. ECU发送报文时需要:构建出“安全报文”,然后发送出去

2. ECU接收报文时需要:解析“安全报文”,认证接收的报文是安全可信任的,然后再接收做进一步处理

安全报文介绍

那我们就来看一下安全报文由哪些部分组成:

安全报文由一下组成:

报头(header):可用来指明安全PDU的长度

真实的I-PDU(Authentic I-PDU):需要被保护的数据

新鲜度值(Freshness Value)

身份验证器(Authenticator):通常使用消息认证码,即Message Authentication Code,简称MAC

由于SecOC机制需要占用总线带宽,因此一般适用于CANFD通讯网络。而在实际使用中,新鲜度值和MAC可能会使用较多长度的数据来提高安全性,但这又会消耗大量的带宽等资源,所以常使用截取的方式做平衡处理。

新鲜度值和MAC都按照完整的值来生成,但是在发送和认证的时候只会截取一部分。

由上面的分析可以看出,除了真实报文外,组成“安全报文”比较重要的两部分就是:

1. 新鲜度值(Freshness Value)

2. 身份验证器(Authenticator)

新鲜度值

在Autosar SecOC中,给出了多种新鲜度值管理方案:

  1. 基于Counter的递增,即包含了原有方案的机制

  2. 基于全局时间戳,源于时间戳的唯一性

  3. 基于同步的复合Counter

这里我们主要谈一下第三种方案。

新鲜度值的构成:基于同步的复合Counter

在此方案中,完整的新鲜度值包括

同步计数器(Trip Counter: TripCnt)、 

重置计数器(Reset Counter: RstCnt)、

消息计数器(Message Counter: MsgCnt):消息计数器又分为高值(MsgCntUpper)和低值(MsgCntLower)

重置标志值(Reset Flag)

我们上文提到,为了降低带宽等资源的消耗,构建的“安全报文”中不会包括完整的新鲜度值和MAC,而是会截取一部分。

从上图Figure21 可看出,真正在报文中新鲜度值只包含消息计数器的低值(MsgCntLower)和重置标志值(Reset Flag)。如下图所示:

而同步计数器和重置计数器会由同步报文发出。如下图所示:

看到这里,我们回顾一下,我们前面讲了两种报文:

一种是安全报文:真实报文+裁剪过的新鲜度值+裁剪过的MAC值

安全报文的目的:报文真实性认证保护,防止重放攻击

一种是同步报文:新鲜度值中的Trip Conter+新鲜度值中的Reset Conter+MAC值

同步报文的目的:节点之间的新鲜度值计数器,可能会由于各种原因存在一定的差异,误差,这种时候就需要同步报文,来帮助节点新鲜度值计数器的重新构建,进行节点之间新鲜度值的同步处理。

具体新鲜度值怎么同步,怎么构建,接下来会讲到。

新鲜度值的管理

采用一主多从通讯模式实现新鲜值同步报文收发,如下图所示。

主节点:发送新鲜值同步报文的ECU为主节点,在车载网络中主节点一般是Gateway。

从节点:接收新鲜值同步报文的ECU为从节点。

Tips:不管主节点还是从节点,都可以作为发送节点或者接受节点。

新鲜度值中每个计数器详解

MsgCnt达到最大值:维持最大值

RstCnt达到最大值:维持最大值

TripCnt达到最大值:重置

TripCounter和ResetCounter由主ECU发送,其他ECU接收,保持此值。

MessageCounter每个ECU发送的一次I-PDU加1,当ResetCounter变化时,MessageCounter变为初始值0,到达最大值时保持最大值发送ResetFlag与ResetCounter完成同步,并保持ResetCounter的低位。

上图讲解:

Master ECU 主节点:

通过周期性发送同步报文,给从节点分发TripCnt, RstCnt。

TripCnt: 每次上电+1

RstCnt: 周期性+1,TripCnt更新时, RstCnt重置

Slave ECU从节点:

TripCnt: 根据同步报文更新

RstCnt: 根据同步报文更新

MsgCnt Lower: 每发送一个报文,+1

MsgCnt Upper: MsgCnt Lower溢出出时,+1

Reset Flag:RstCnt的低2位

新鲜度值的构建

从前文可知,安全报文里的新鲜度值是被裁剪过的,那么怎么才能得到完整的新鲜度值呢?

Tips:为什么要得到完整的新鲜度值?

          因为安全报文中的MAC值的计算是要用到完整的新鲜度值的

首先我们来了解一下下面几个名词:

1. Latest value:最新的值,来自于主节点的同步消息,包括: TripCnt, RstCnt

2. Previous value:先前的值,成功发送和成功接收安全报文时维护的新鲜度值

3. Receive value:接收的安全报文的值,包括: MsgCnt Lower, Reset Flag

发送节点:

比较TripReset,判断是否重置Message Counter

接收节点:

先比较ResetFlag,判断同步消息和接收数据的关系:

1. Latest value = Received value

    同一个RstCycle正常接收数据

2. Latest value - 1 = Received value

    RstCycle临界点,发送方还未更新

    发送方丢失一次同步

3. Latest value + 1 = Received value

    RstCycle临界点,接收方还未更新

     接收方丢失一次同步

4. Latest value - 2 = Received value

    发送方丢失两次同步

5. Latest value + 2 = Received value

    接收方丢失两次同步

1. Latest value = Received value

1. 比较TripReset,判断是否需要更新Trip,Reset

2. 比较MsgCnt Lower,判断MsgCnt Upper是否存在进位

2. Latest value - 1 = Received value

1. 比较TripReset,判断是否需要更新Trip,Reset(发送节点使用前一个Trip,Reset)

2. 比较MsgCnt Lower,判断MsgCnt Upper是否存在进位(发送节点使用前一个Trip,Reset)

3. Latest value + 1 = Received value

1. 比较TripReset,判断是否需要更新Trip,Reset(接受节点使用前一个Trip,Reset)

2. 比较MsgCnt Lower,判断MsgCnt Upper是否存在进位(接受节点使用前一个Trip,Reset)

接受节点新鲜度值构造总结

第四种和第五种情况类似第二种和第三种情况,这边就不再赘述。这边对接受节点的新鲜度值构造做一个总结:

1. 比较接受到的Reset Flag和最新的Reset Flag,获得差值X(哪个节点存在同步消息丢失)

2. 代入X并比较最新的TripRest和先前的TripReset,判断是否更新Trip,Reset

3. 比较接受的MsgCnt Lower和先前的MsgCnt Lower,判断是否进位MsgCnt Upper

FVM与SecOC的交互关系

FVM并不是标准的AUTOSAR组件,其作为复杂设备驱动,与SecOC交互图如下:

目标ECU应该提供以下AUTOSAR基础软件:

  1. System Service(含OS/EcuM/ComM)

  2. Communication(含Com/SecOC/PduR)

  3. 秘钥算法模块(CSM/CryIf/Crypto)

  4. Memory(含NVM/MemIf/Fee)

  5. Diagnostics(含DCM)

  6. MACL(含MCU)

AUTOSAR中的安全解决方案

Secured IPdu的创建

创建一个Secured IPdu分为以下六步:

  • 准备Secured IPdu,分配所需buffer

  • 获取待构建数据,也即Data ID,Authentic IPdu还有新鲜值

  • 生成验证码

  • 构建Secured IPdu

  • 增加新鲜值

  • 发送Secured IPdu

IPdu的验证

Secured IPdu的验证也分为六步:

  • 解析Authentic IPdu,新鲜值和验证码

  • 从新鲜值管理器获取新鲜值

  • 获取待验证数据

  • 检查验证信息

  • 给新鲜值管理器发送确认

  • 将Authentic IPdu传给上层

附录

FVM 接口

Std_ReturnType Fvm_SetTripResetSyncMsg(uint16 syncId,uint32 tripcnt, uint32 resetCnt); Std_ReturnType Fvm_GetTripResetSyncMsg(uint16 syncId, uint32* tripCnt, uint32* resetCnt); void Fvm_ResetTripCounter (void); uint32 Fvm_ IncreaseTripCounter (uint16 syncId); void Fvm_Init(const Fvm_RWFunc * func); typedef Std_ReturnType (*Fvm_WriteTripFunc) (uint16 tripId,uint32 tripCounter); typedef Std_ReturnType (*Fvm_ReadTripFunc) (uint16 tripId,uint32 *tripCounter); uint32 Fvm_GetRxMsgCnt(uint16 freshnessValueID);

SecOC适配接口

Std_ReturnType SecOC_GetRxFreshness (uint16 SecOCFreshnessValueID,const uint8* SecOCTruncatedFreshnessValue,uint32 SecOCTruncatedFreshnessValueLength,uint16 SecOCAuthVerifyAttempts,uint8* SecOCFreshnessValue,uint32* SecOCFreshnessValueLength); Std_ReturnType SecOC_GetTxFreshness (uint16 SecOCFreshnessValueID,uint8* SecOCFreshnessValue,uint32* SecOCFreshnessValueLength); Std_ReturnType SecOC_SPduTxConfirmation(uint16 SecOCFreshnessValueID); void Fvm_VerificationStatusCallout (SecOC_VerificationStatusType verificationStatus);

安全报文发送时序图

安全报文的接收时序图

 

新鲜值处理时序图

这篇关于汽车网络信息安全技术之AUTOSAR SecOC,非常详细的学习笔记,由浅入深的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/795908

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

如何在Mac上安装并配置JDK环境变量详细步骤

《如何在Mac上安装并配置JDK环境变量详细步骤》:本文主要介绍如何在Mac上安装并配置JDK环境变量详细步骤,包括下载JDK、安装JDK、配置环境变量、验证JDK配置以及可选地设置PowerSh... 目录步骤 1:下载JDK步骤 2:安装JDK步骤 3:配置环境变量1. 编辑~/.zshrc(对于zsh

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例