4. 密码学基础与版本安全

固件防回滚与版本安全工程并不是“加一个签名”这么简单,它依赖一整套密码学原语与信任传递机制。哈希负责把任意长度的固件映像压缩成固定长度的指纹,数字签名负责证明“这个指纹由谁发布”,HMAC 负责在对称密钥场景下做完整性校验,密钥派生负责从根密钥安全地派生出各级子密钥,证书链负责把设备内置的信任锚延伸到可轮换的签名密钥,而安全启动与固件签名验证流程则把这些原语串成一条可执行的信任链。理解这些原语的分工与边界,是设计防回滚策略的前提。

核心原理:五类原语的分工

哈希(Hash)是单向压缩函数,输入固件映像,输出固定长度摘要,如 SHA-256 输出 32 字节。它的关键性质是抗碰撞与雪崩效应:固件任意一个字节变化,摘要都会完全不同。因此哈希是“完整性”的基础,但它本身不提供身份认证——攻击者可以同时替换固件和摘要。

数字签名用非对称密钥解决身份问题。发布方用私钥对固件摘要签名,设备用公钥验签。常见算法包括 ECDSA P-256、Ed25519 和 RSA-PSS。签名保证“来源可信 + 内容未被篡改”,但验签公钥本身必须可信,这就引出了证书链。

HMAC 使用对称密钥对消息做完整性校验,计算快、资源占用低,适合设备内部或产线环节的快速校验,但它无法向第三方证明来源,因为验证方必须持有同一密钥。

密钥派生(KDF)从根密钥或主密钥派生出加密密钥、签名密钥、会话密钥等。常用 HKDF、PBKDF2 或基于 AES-CMAC 的派生。派生时通常绑定用途标签和版本号,避免密钥跨用途复用。

证书链把信任锚(设备内置根 CA 公钥)逐级延伸到固件签名证书。设备验证时逐级验签,直到根证书,从而支持签名密钥轮换而不必更换设备根信任。

固件签名验证与安全启动信任链 发布侧(签名) 固件映像 firmware.bin 版本号 + 安全版本计数器 SHA-256 哈希 得到 32 字节摘要 私钥签名 ECDSA / Ed25519 / RSA-PSS 签名证书 + 证书链 签名密钥可轮换 打包固件包 映像 + 签名 + 证书链 + 版本元数据 OTA / 烧录 设备侧(验证与安全启动) BootROM 信任锚 内置根 CA 公钥 / 哈希白名单 证书链验证 逐级验签至根证书 提取签名公钥 验证固件签名 重算固件哈希 与签名摘要比对 版本与回滚检查 安全版本计数器单调递增 密钥派生 KDF HKDF / AES-CMAC 派生会话密钥 验证通过 → 跳转执行固件 任一环节失败 → 拒绝启动 / 进入恢复模式 信任根 → 证书链 → 签名公钥 → 固件摘要 → 版本策略,逐级传递信任

方法流程:从签名到安全启动的验证链

发布侧流程通常为:读取固件映像与版本元数据,计算 SHA-256 摘要,用私钥对摘要签名,将映像、签名、证书链和版本信息打包。设备侧流程则严格按信任链顺序执行:

  1. BootROM 使用内置根 CA 公钥验证签名证书链,确认签名公钥可信。
  2. 用签名公钥验证固件签名,确认摘要来源可信。
  3. 重新计算固件映像哈希,与签名中的摘要比对,确认内容未被篡改。
  4. 检查版本号与安全版本计数器,拒绝低于当前安全版本的固件。
  5. 使用 KDF 从根密钥派生会话密钥,用于后续加密通信或镜像解密。
  6. 全部通过后跳转执行;任一失败则拒绝启动或进入恢复模式。

关键点:哈希保证完整性,签名保证来源,证书链保证公钥可信,版本计数器保证不可回滚,KDF 保证密钥隔离。五者缺一不可。

案例与场景:OTA 升级中的签名验证

假设设备当前安全版本计数器为 7,云端下发版本 8 的固件包。设备 BootROM 先验证证书链,再用签名公钥验签,重算哈希一致后,检查版本 8 大于 7,允许升级并将计数器更新为 8。若攻击者重放版本 6 的旧固件包,即使签名和哈希都正确,版本检查也会因 6 小于 7 而拒绝,从而防止回滚攻击。

# 发布侧签名示例(伪命令)
firmware-sign --input firmware_v8.bin \
  --key release_ecdsa_p256.pem \
  --cert-chain release_chain.pem \
  --version 8 --security-counter 8 \
  --output firmware_v8_signed.pkg

# 设备侧验证日志示例
[BOOT] verify cert chain ... OK
[BOOT] verify signature ... OK
[BOOT] recompute hash ... MATCH
[BOOT] security counter: current=7, image=8 ... PASS
[BOOT] derive session key via HKDF ... OK
[BOOT] jump to firmware v8

误区与复盘

常见误区 后果 正确做法
只校验哈希,不验签名 攻击者可同时替换固件与哈希 哈希必须与数字签名配合使用
签名密钥硬编码在固件中 密钥泄露后无法轮换 使用证书链,支持签名密钥轮换
忽略安全版本计数器 旧版本固件可被重放 计数器单调递增,拒绝低版本
HMAC 密钥与签名私钥混用 密钥用途交叉,扩大攻击面 通过 KDF 按用途派生独立密钥
证书链未校验有效期与用途 过期或错误用途证书被接受 校验有效期、Basic Constraints 与 Key Usage

安全启动验证必须“先验签、后执行”,且验证代码本身应位于不可篡改的 BootROM 或受保护区域。若验证逻辑可被绕过,整条信任链即失效。

综上,固件版本安全的核心不是单一算法,而是哈希、签名、HMAC、KDF、证书链与安全启动流程的协同。只有把信任锚、签名验证、版本策略和密钥派生完整串联,才能有效抵御篡改与回滚攻击。