编辑推荐: |
本文主要介绍AUTOSAR SecOC通讯,SecOC的通讯加密和认证过程以及安全报文的发送,希望对你的学习有帮助。
本文来自于CSDN,由火龙果软件Alice编辑,推荐。 |
|
为什么用SecOC
在车载网络中,CAN总线作为常用的通讯总线之一,其大部分数据是以明文方式广播发送且无认证接收。这种方案具有低成本、高性能的优势,但是随着汽车网联化,智能化的业务需要,数据安全性被大家越来越重视。传统的针对报文添加 RollingCounter和Checksum的信息 ,实现的安全性十分有限,也容易被逆向破解,伪造报文控制车辆。
在AUTOSAR架构中对于网络安全的机制,有E2E(End to End)保护,另外还有SecOC(Secure Onboard Communication),主要实现对车内敏感数据信息进行认证。
SecOC 是在AUTOSAR软件包中添加的信息安全组件,该特性增加了 加解密运算,密钥管理,新鲜值管理和分发 等一系列功能和新要求。
SecOC模块在PDU级别上为关键数据提供有效可行的身份验证机制 。该规范主要使用带有消息认证码(MAC-Message Authentication Code)的对称认证方法。与不对称方法对比,他们使用更小的密钥实现了相同级别的安全性,并且可以在软件和硬件中紧凑高效地实现。但是,规范提供了两种必要的抽象级别,因此对称和非对称身份验证方法都可使用。 由于非对称加密计算量大,目前主要都是采用对称加密。 什么是对称加密与非对称加密
对称加密算法:
对称加密算法的 加密和解密使用的密匙是相同的 ,也就是说如果通讯两方如果使用对称加密算法来加密通讯数据,那么通讯双方就需要都知道这个密匙,收到通讯数据后用这个密匙来解密数据。
非对称加密算法:
非对称算法中用到的密匙有两个,分别是 公匙和私匙 ,要求通讯双方都有自己的公匙和私匙, 自己公匙加密的数据只有自己的私匙才能解开 , 自己私匙加密的数据也只有自己的公匙才能解开。 公匙是可以公布在网络上的,相当于一个公共的电话簿,可以被其他人获取到的。
以一个通信的例子来说明非对称算法:
A 要和 B 进行通信, A在网络上获取到B的公匙 ,然后把数据用B的公匙进行加密发送给B,B收到了数据后,B用自己的私匙进行解密数据,然后就可以看到数据内容了,即使在网络传输中加密数据被黑客截取,由于黑客没有B的私匙,他也无法解密数据进行查看。
在通信中 对称加密算法比较高效 ,但是需要告知对方加密钥匙,在实际运用时比较麻烦,所以一般都是用 非对称加密算法来加密对称加密算法的钥匙,然后发送给对方 ,对方收到对称加密算法的钥匙后,后续通信就用对称加密算法来加密消息内容了。
目前, 使用非对称加密方法的数据签名还不能用于车载通讯,因为这样会显著增加计算量。 MAC和新鲜度值的作用
- MAC可以防止插入恶意消息
- 新鲜度值可以防止重放攻击
其中MAC和新鲜度分别具有不同的作用,在SecOC标准中,AUTOSAR主要基于两种手段来实现数据的真实性和完整性的校验:
1.基于MAC的身份验证:
MAC(Message Authentication Code)是保障信息完整性和认证的密码学方法之一,其中CMAC(Cipher based MAC,CMAC 一般用于对称加密 ,整车厂可在 车辆下线刷写程序时静态分配密钥,也可选择使用云端服务器动态地给车辆分配密钥 。)是车载总线加密认证常用方案。
MAC的作用不是防止有效数据被泄露,而是为了 保护数据不会被攻击方篡改,即完成数据来源的认证。 如需保护通信数据不被攻击方监听,则报文的有效数据还需要进行额外的加密。
2.基于Freshness的防重放攻击
为了 降低重复攻击的风险 ,则需要在Secured I-PDU中加入新鲜度值, Freshness Value是一个根 据一定逻辑不断更新的数值 ,Freshness Value的更新方法多种多样, AUTOSAR 标准将 计数器或基于时间的新鲜度值作为典型选项 。具体使用何种和具体的加密方式,以及如何定义新鲜度度其实并不在标准之内,这就给OEM有了各自定制化方案的可选余地,因此OEM 在实施 SecOC 方案时需要定义和做好两个关键部分: 新鲜度值管理和密钥管理 。 SecOC的通讯加密和认证过程
在发送节点,SecOC模块向待发送的Authentic I-PDU添加认证信息从而创建Secured I-PDU。
认证信息包括Authenticator(例如CMAC)和可选的Freshness Value。
无论Freshness Value是否包含在打包后的Secured I-PDU中,在生成Authenticator期间都会考虑Freshness Value。
在接收节点,SecOC模块通过验证收到的Secured I-PDU中包含的Authenticator来判断Authentic I-PDU的来源。为了实现认证, 接收节点除了需要Authentic I-PDU外还需要知道发送节点计算Authenticator时使用的Freshness Value。
新鲜度值收发双方验证机制:
SecOC是在AutoSAR软件包中 添加的信息安全组件,增加了加解密运算、密钥管理、新鲜值管理和分发等一系列的功能和新要求。
SecOC占用CAN报文的负载中的若干字节,在其中填入身份认证和新鲜值字段。
于是,假如搭载SecOC后,一次CAN通信就变成了如下过程:
1.报文的原始数据切片,加上秘钥,加上新鲜值,通过算法生成身份认证信息MAC。
2.然后再将身份认证信息的切片和新鲜值切片,插入CAN报文负载的指定字节中。其中新鲜值切片可以长度为0,但是 身份认证信息的切片必须要存在 。
3.接收方就是个逆过程了,校验失败就扔掉
详细的SecOC通讯过程如下:
安全报文介绍
安全报文的组成:
安全报文由组成
1.一个头
2.真实的I-PDU
3.新鲜度值
4.用新鲜度值创建的认证器 (eg.MAC)
由于SecOC机制需要占用总线带宽,因此一般适用于CANFD通讯网络。
其中身份验证器(例如MAC)是指 使用密钥、安全I-PDU的数据标识符ID、真实有效负载和新鲜度值生成的唯一身份验证数据字符串 。消息头可用来指明安全PDU的长度。
数据结构如下:
Authentic I-PDU是需要被保护的数据;
Authenticator为认证信息(通常使用消息认证码,即Message Authentication Code,简称MAC);
Secured I-PDU Header为可选用的报头;Freshness Value为可选用的新鲜度值。
而在实际使用中,新鲜度值和MAC可能会使用较多长度的数据来提高安全性,但这又会消耗大量的带宽等资源,所以常使用 截取 的方式做平衡处理。
新鲜度值和MAC都按照 完整的值 来生成,但是在发送和认证的时候只会截取一部分。
新鲜度值管理:
在SecOC中,给出了多种新鲜度值管理方案:
1.基于Counter的递增,即包含了原有方案的机制
2.基于全局时间戳,源于时间戳的唯一性
3.基于同步的复合Counter
这里我们主要谈一下第三种方案。在此方案中,完整的新鲜度值包括:
1.同步计数器(Trip Counter)
2.重置计数器(Reset Counter)
3.消息计数器(Message Counter),消息计数器又分为高值和低值,真实在报文中发送的值只包含 消息计数器的低值和重置标志值 。
4.重置标志值(Reset Flag)
新鲜度值结构图
TripCounter和ResetCounter由主ECU发送,其他ECU接收,保持此值。
MessageCounter每个ECU发送的一次I-PDU加1 ,当ResetCounter变化时,MessageCounter变为初始值0,到达最大值时保持最大值发送ResetFlag与ResetCounter完成同步,并保持ResetCounter的低位。
新鲜度等值变化规则
FVM新鲜值管理
采用一主多从通讯模式实现新鲜值同步报文收发,如下图所示。发送新鲜值同步报文的ECU为主节点,接收新鲜值同步报文
的ECU为从节点。在车载网络中主节点一般是Gateway。
同步报文的结构:
同步报文包含:行程计数器和重置计数器以及授权码。
行程计数器:主节点每次上电、唤醒(可包含复位)和检测到新的通讯安全从节点加入网络通信时使发送的行程计数器+1,第二帧和第三帧保持不变,连发三帧,间隔50ms;之后按1s周期发送。发送属性根据项目需求可自定义。
重置计数器:同步报文每次发送第一帧时加1,第二帧第三帧保持不变。
授权码由SecOC计算追加,用于校验同步计数器“TripCnt |ResetCnt”值的完整性和真实性校验。
同步报文发送时序图:
同步报文接收时序图:
SecOC与PduR模块的关系
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)
7.IO(含Port)
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);
|
安全报文发送时序图
安全报文的接收时序图
新鲜值处理时序图
新鲜值构建的三种方式:
- 基于单个新鲜度计数器的新鲜度值
- 基于单个新鲜度时间戳的新鲜度值
- 基于多个新鲜度计数器的新鲜度值
Freshness Value Based on Single Freshness Counter
Freshness Value Based on Single Freshness Timestamp
Freshness Value Based on Multiple Freshness Counters
|