3. MAVLink2签名机制概述

MAVLink2 在原有消息帧结构上引入了一个可选的签名(Signature)字段,用于为飞控与地面站、机载计算机、载荷之间的关键指令提供完整性校验与来源认证。它并不对消息载荷做加密,也不隐藏通信内容,而是解决“这条消息是否被篡改、是否确实来自持有密钥的合法节点”这两个问题。理解签名机制,是后续配置密钥、排查签名失败、设计安全链路的前提。

一、签名要解决的核心问题

在未启用签名的 MAVLink 链路上,任何能够接入链路(例如数传电台、Wi-Fi 桥接、串口旁路)的设备都可以伪造或修改消息。攻击者可以注入一条伪造的 COMMAND_LONG 让无人机解锁、返航或切换模式,也可以篡改 GLOBAL_POSITION_INT 等遥测数据。签名机制的设计目标可以归纳为三点:

  • 完整性:接收方能够发现消息在传输过程中被修改,哪怕只改动一个字节。
  • 来源认证:接收方能够确认消息由持有相同密钥的节点发出,而不是任意第三方。
  • 防重放:通过时间戳与链路标识,降低旧消息被截获后重新注入的风险。
签名不等于加密。消息内容仍然以明文传输,抓包工具依然可以读取载荷;签名只保证“没被改”和“来自合法节点”。如果需要保密,应在上层或链路层另行加密。

二、签名在消息帧中的位置

MAVLink2 帧由帧头(STX、长度、不兼容标志、兼容标志、序列号、系统 ID、组件 ID)、消息 ID、载荷(Payload)以及可选的校验和(Checksum)和签名(Signature)组成。签名位于帧尾,共 13 字节,紧跟在 2 字节 CRC 之后。其结构如下:

MAVLink2 帧(启用签名时):
+------+------+------+------+------+------+------+------+---------+----------+------------------+
| STX  | LEN  | INC  | CMP  | SEQ  | SYS  | COMP | MSGID| PAYLOAD | CHECKSUM |   SIGNATURE(13B) |
+------+------+------+------+------+------+------+------+---------+----------+------------------+
                                                                              | linkID(1B)       |
                                                                              | timestamp(6B)    |
                                                                              | sig(6B)          |

其中 linkID 用于区分不同的通信链路,timestamp 是发送方自某个时间基准起计算的 48 位时间戳(通常为 10 微秒为单位),sig 是基于密钥、CRC 和帧头信息计算出的 48 位签名值。接收方只有在本地也配置了相同密钥时,才会去校验这 13 个字节;否则会直接忽略签名部分。

MAVLink2 签名帧结构与校验流程 帧头 STX/LEN/SEQ/SYS… 消息 ID MSGID (24bit) 载荷 Payload 明文,可被读取 CRC 2 字节 签名 Signature (13B) linkID + timestamp + sig linkID (1B) 区分链路 timestamp (6B) 防重放 sig (6B) 完整性认证 发送方 密钥 + 帧头 + CRC → 计算 48bit sig 接收方 相同密钥 + 收到帧 → 重算并比对 sig 帧 校验失败 → 丢弃消息 校验通过 → 交给上层 未配置密钥 → 忽略签名

三、启用条件与基本工作流程

签名不是默认开启的。要真正生效,发送方和接收方必须同时满足以下条件:

  1. 双方都使用 MAVLink2 协议版本,MAVLink1 帧没有签名字段。
  2. 双方配置了相同的 32 字节签名密钥(通常以十六进制字符串形式给出)。
  3. 发送方在发送时启用签名,接收方在解析时启用签名校验。
  4. 链路两端的 linkID 与时间戳基准能够被正确维护,避免误判重放。

基本工作流程可以概括为“发送端计算、接收端重算比对”。发送端在组帧完成后,使用密钥、帧头、消息 ID、载荷和 CRC 作为输入,通过 MAVLink 定义的签名算法生成 48 位签名值,并连同 linkID 和 timestamp 一起写入帧尾。接收端收到帧后,用本地密钥对同样的输入重新计算签名,并与帧尾携带的签名值比较;同时检查时间戳是否在允许窗口内。只有两者都通过,消息才会被接受。

签名校验失败的消息通常会被直接丢弃,不会触发任何业务逻辑。因此,如果发现“指令发了但飞机没反应”,除了检查链路质量,也要确认签名密钥是否一致、时间戳是否异常。

四、典型场景与常见误区

在一个典型的无人机安全链路中,飞控通过数传电台与地面站通信,同时通过串口连接机载计算机。若只在地面站与飞控之间启用签名,而机载计算机未配置密钥,则机载计算机发出的消息会被飞控丢弃,表现为“机载计算机控制失效”。因此,启用签名前必须梳理所有需要与飞控通信的节点,并统一密钥配置。

项目 说明 常见误区
密钥长度 32 字节,通常以 64 位十六进制字符串表示 误以为可以随意使用短密码
签名位置 帧尾 CRC 之后的 13 字节 误以为签名在载荷内部
时间戳 48 位,用于防重放 忽略时间基准,导致大量消息被丢弃
linkID 区分不同链路,避免跨链路重放 多条链路使用相同 linkID
加密 签名不提供保密性 误以为启用签名后抓包看不到内容

复盘时可以用一个简单清单快速定位问题:确认协议版本是否为 MAVLink2;确认双方密钥字符串是否完全一致;确认发送端是否真的在组帧时附加了签名;确认接收端是否开启了签名校验;确认时间戳与 linkID 是否合理。只要其中任一环节不满足,签名机制就不会按预期工作。

签名密钥属于敏感信息,不应硬编码在公开代码仓库或日志中。实际部署时应通过安全配置通道分发,并定期轮换。

总体来看,MAVLink2 签名机制以较小的帧开销换取了消息完整性与来源认证能力,是构建可信无人机通信链路的基础组件。掌握其帧结构、启用条件和校验流程,才能在后继的密钥管理、链路调试与安全加固中做到有的放矢。