3、MACsec原理:MACsec协议栈、安全通道与安全关联、GCM-AES加密
好,咱们今天聊聊MACsec。说实话,这个协议在车载领域这几年越来越火。我最早接触它是在做T-Box项目的时候,当时客户要求网关到域控制器之间的链路必须加密,但又不能引入太大的延迟。试了一圈,最后还是选了MACsec。
为什么?因为它工作在二层,对上层应用完全透明。你想想看,IPsec虽然也能加密,但得配策略、建隧道,搞不好还会影响TCP分片。而MACsec呢?插上就能用,性能还特别好。嗯,咱们今天就把它掰开揉碎了讲清楚。
3.1 MACsec协议栈:它到底在OSI模型的哪一层?
先看一张经典的协议栈对比图。我习惯把MACsec放在数据链路层的MAC子层,紧挨着物理层。
| OSI层 | 传统以太网 | MACsec | IPsec |
|---|---|---|---|
| 应用层 | HTTP/DoIP | HTTP/DoIP | HTTP/DoIP |
| 传输层 | TCP/UDP | TCP/UDP | TCP/UDP |
| 网络层 | IP | IP | IP + IPsec |
| 数据链路层 | MAC | MACsec + MAC | MAC |
| 物理层 | PHY | PHY | PHY |
看到没?MACsec插在MAC层和PHY层之间。这意味着什么?意味着所有经过网卡的数据帧,在发出去之前都会被加密。上层应用、TCP/IP协议栈,完全不知道底下发生了加密这件事。
核心要点:MACsec是逐跳加密,不是端到端加密。它保护的是相邻两个节点之间的链路。比如网关到域控,或者域控到摄像头。如果你需要端到端保护,那得用IPsec或者TLS。
我在项目中遇到过一个问题:有人把MACsec和IPsec混用,结果发现性能下降得厉害。后来一查,原来是两层加密叠加了。你想想看,一个数据包先被IPsec加密一次,到了MAC层又被MACsec加密一次,CPU直接拉满。所以我的建议是:明确你的保护范围。链路安全用MACsec,端到端安全用IPsec,别混着来。
3.2 安全通道与安全关联:一对一的加密关系
MACsec里有两个核心概念:安全通道(Secure Channel, SC)和安全关联(Secure Association, SA)。说白了,它们定义了谁和谁在加密通信,以及用什么密钥。
我打个比方。安全通道就像两个人之间的一条专用电话线。这条线上只能有两个人通话,不能有第三个人插进来。而安全关联呢?就是这条电话线上使用的加密规则——比如今天用密钥A,明天换密钥B。
具体来说:
- 安全通道(SC):由发送方的MAC地址和一个通道标识符(Channel Identifier)唯一确定。每个SC包含一个发送方向和一个接收方向。说白了,就是一条单向的加密链路。
- 安全关联(SA):每个SC可以包含多个SA,但同一时刻只有一个SA是活跃的。SA里保存了加密密钥、初始向量(IV)、以及数据包计数器等信息。
为什么会这样设计?我刚开始学的时候也觉得有点绕。后来做项目才明白,这是为了密钥更新。你想想看,如果密钥永远不变,那时间长了肯定不安全。但密钥更新又不能中断通信。所以MACsec的做法是:先建立一个新的SA(新密钥),等旧SA里的数据包都处理完了,再切换到新SA。整个过程无缝衔接。
避坑指南:我曾经在调试时发现,两个设备明明配了相同的密钥,但就是不通。查了半天,发现是SA的活跃状态没同步。一个设备在用SA1,另一个设备还在用SA0。记住:通信双方必须使用同一个活跃的SA,否则数据包会被丢弃。
3.3 GCM-AES加密:又快又安全的加密模式
MACsec使用的加密算法是GCM-AES。GCM代表Galois/Counter Mode,AES就是高级加密标准。这个组合在车载领域特别受欢迎,原因很简单:它同时提供了加密和完整性校验,而且硬件加速支持特别好。
咱们拆开来看:
- AES:对称加密算法,密钥长度可以是128位、192位或256位。车载场景下,我建议直接用AES-256,虽然性能稍微差一点,但安全性更高。毕竟车上的数据关系到人身安全。
- GCM模式:这是一种带认证的加密模式。它把加密和消息认证码(MAC)合二为一。加密的同时,还能检测数据有没有被篡改。
GCM的工作流程大致是这样的:
- 把明文数据分成128位的块。
- 用AES加密每个块,但加密的不是明文本身,而是一个计数器值。
- 把加密后的计数器值和明文做异或,得到密文。
- 同时,用Galois域乘法计算一个认证标签,用于完整性校验。
你可能会问:为什么不用CBC模式?嗯,CBC模式有个问题,它不能并行计算。每个块的加密依赖前一个块的结果。而GCM的计数器模式可以并行,硬件实现起来特别快。我在测试中发现,同样一个千兆网口,用GCM-AES-128能达到线速,而用CBC-AES-128只能跑到600Mbps左右。
重要提醒:GCM模式对初始向量(IV)的重复使用非常敏感。如果两个数据包用了相同的IV和相同的密钥,攻击者可以直接恢复出密钥。我曾经见过一个案例,有人把IV写死了,结果整个网络的安全形同虚设。记住:IV必须唯一,通常用数据包计数器来生成。
3.4 数据包格式:加密后的帧长什么样?
MACsec加密后的以太网帧,和普通帧不太一样。它会在原始帧的基础上,插入一个安全标签(SecTAG),并在尾部添加完整性校验值(ICV)。
结构如下:
+----------------+----------------+----------------+----------------+----------------+
| 目的MAC地址 | 源MAC地址 | SecTAG | 加密后的数据 | ICV |
| (6字节) | (6字节) | (16字节) | (可变长度) | (8/16字节) |
+----------------+----------------+----------------+----------------+----------------+
其中SecTAG包含了:
- EtherType(0x88E5):告诉交换机这是MACsec帧
- TCI/AN字段:包含版本号、加密指示位、以及活跃的SA编号
- SL字段:短长度,用于指示加密数据的长度
- PN字段:数据包编号,用于防重放攻击
ICV是完整性校验值,长度可以是8字节或16字节。我建议用16字节,虽然多占了一点带宽,但安全性更高。毕竟车载网络里,一个恶意数据包可能造成刹车失灵,这点带宽成本值得花。
实战经验:我在做ADAS域控项目时,发现摄像头传回来的视频流经过MACsec加密后,帧率下降了5%。后来优化了硬件加速的配置,把GCM的并行计算打开,帧率就恢复正常了。所以如果你遇到性能问题,先检查硬件加速有没有启用,别急着换算法。
3.5 小结
好了,咱们把MACsec的原理捋一遍:
- 它工作在二层,对上层透明,适合车载的网关到域控制器链路。
- 安全通道和安全关联定义了加密关系,支持无缝密钥更新。
- GCM-AES同时提供加密和完整性校验,性能优秀,但要注意IV的唯一性。
- 加密后的帧增加了SecTAG和ICV,交换机可以识别并处理。
下一章咱们会讲MACsec的密钥协商协议——MKA。说实话,那部分才是真正容易踩坑的地方。密钥怎么分发?怎么同步?怎么处理掉线重连?嗯,到时候咱们再细聊。