AUTOSAR 入门教程 19:SecOC

理解 SecOC 如何为车载消息添加认证保护,掌握 MAC 计算流程和 Freshness 防重放机制,以及与 Crypto 栈的协作关系。

CAN 总线没有加密、没有认证、没有防重放。任何接入总线的设备都能伪造报文——一条伪造的刹车信号可以让正常行驶的车辆突然减速。传统 CAN 设计于 1980 年代,当时车载网络是物理隔离的,安全不在设计考虑之内。随着车联网和远程接入的普及,总线不再是封闭系统。AUTOSAR 的 SecOC(Secure Onboard Communication)就是为这个威胁建模的:它不加密数据内容,而是为每条关键消息附加认证信息,让接收方验证"这条消息确实来自合法发送者,且没有被篡改或重放"。

SecOC 的定位

SecOC 位于 PduRouter 旁边,拦截需要安全保护的 PDU,在发送时添加认证信息,在接收时验证认证信息。它不替代现有的通信协议——CAN 报文格式不变,只是多了几个字节的认证数据。

SecOC 保护的对象是 I-PDU(交互层 PDU),不是底层的 CAN 帧。一个 I-PDU 可能包含多个信号,SecOC 对整个 I-PDU 做认证。这意味着即使攻击者截获了 CAN 帧,无法伪造正确的认证信息就无法通过验证。

SecOC 认证流程:发送端与接收端 发送端(Sender) Authentic I-PDU 原始数据 SecOC(发送端) 拼接 Data ID + I-PDU + FV 调用 Crypto 计算 CMAC Secured I-PDU I-PDU + MAC + FV CAN Bus / Ethernet 接收端(Receiver) Secured I-PDU I-PDU + MAC + FV SecOC(接收端) 验证 MAC:用本地密钥重算 CMAC 验证 FV:检查 Freshness Value 递增 通过 Authentic I-PDU → 上层处理 失败 丢弃 + 通知上层 Crypto 栈(CSM → CryIf → HSM) 密钥管理 + CMAC 计算 ← PduR →

发送端:添加认证

发送端的流程分三步。

第一步,拼接待认证数据。SecOC 将三个字段拼接在一起:Data ID(消息标识符,唯一标识这条通信关系)、完整的 Authentic I-PDU(原始数据)、Freshness Value(新鲜度值)。拼接结果就是待认证的输入。

第二步,计算 MAC。SecOC 将待认证数据连同密钥一起交给 Crypto 栈(CSM 模块),由底层加密引擎计算 CMAC(Cipher-based MAC)。CMAC 是基于对称密钥的消息认证码——发送方和接收方共享同一个密钥,用相同的算法计算,得到相同的结果。

第三步,组装 Secured I-PDU。将原始 I-PDU、截断后的 MAC(通常取前 5-7 字节,不是完整的 MAC 值)和 Freshness Value 组装成 Secured I-PDU,交给 PduRouter 发送到总线。

MAC 截断是出于效率考虑。完整 CMAC 通常是 16 字节,但 CAN 帧总共才 8 字节有效载荷。截断到 5-7 字节,在安全强度和带宽开销之间取平衡。截断意味着理论上碰撞概率增加,但对于车载场景(短消息、受限于物理接触范围),5-7 字节的 MAC 已经提供了足够的安全裕量。

接收端:验证认证

接收端执行对称的验证流程。

SecOC 从收到的 Secured I-PDU 中提取出 Authentic I-PDU、MAC 和 Freshness Value。然后用本地存储的密钥和相同的算法重新计算 CMAC,将计算结果与收到的 MAC 比对。同时验证 Freshness Value 是否大于上次收到的值——如果小于或等于,说明这是一条重放报文,直接丢弃。

两个检查都通过后,SecOC 将验证通过的 Authentic I-PDU 交给 PduRouter 向上层传递。任何一个检查失败,这条消息被丢弃,SecOC 通过回调通知上层验证失败。

Freshness 防重放机制

MAC 只能验证"消息没有被篡改",但不能防止重放攻击——攻击者可以截获一条合法报文,原封不动地重发。Freshness Value 就是防重放的利器。

Freshness Value 是一个单调递增的计数器。每次发送新消息时,Freshness Value 加 1(或基于时间戳递增)。接收方维护每个通信关系的最新 Freshness Value,只接受比上次更大的值。

Freshness Value 的同步是一个工程难点。ECU 掉电重启后,Freshness Value 从 0 开始,但总线上其他 ECU 期望的值可能已经是几千了。SecOC 支持 Freshness Value 的同步机制:在启动阶段通过特定的同步报文交换当前值,或者在认证失败时触发同步流程。同步本身也需要安全保护——攻击者不能伪造同步报文把 Freshness Value 重置为 0。

与 Crypto 栈的协作

SecOC 定义协议和流程,但不直接执行加密运算。所有的 CMAC 计算、密钥访问都委托给 Crypto 栈(教程 20 会详细展开)。协作关系很清晰:SecOC 告诉 CSM"用密钥 K 对这段数据计算 CMAC",CSM 调用底层 HSM 硬件完成计算并返回结果。

这种分离的好处是 SecOC 不需要关心密钥存在哪里、算法如何实现。密钥可以存在 MCU 内置的 HSM 中,也可以存在外部安全芯片里——SecOC 只通过密钥 ID 引用,密钥材料永远不暴露给 CPU。

实践建议

下一篇教程将深入 Crypto 栈的三层架构——SecOC 只是 Crypto 最大的使用场景之一,加密栈还支撑安全启动、密钥管理、固件签名验证等完整的信息安全能力。