3. 密码学基础

固件可信的根基不在代码本身,而在密码学。固件从出厂到启动的每一步——镜像打包、签名、分发、烧录、上电校验——都依赖四类密码学构件:哈希函数负责“指纹”,非对称加密负责“密钥分发与保密”,数字签名负责“来源与完整性”,证书体系与密钥管理负责“信任锚与生命周期”。理解它们的边界与组合方式,才能设计出既安全又可量产的固件信任链。

一、核心原理:四类构件各司其职

哈希函数把任意长度固件镜像压缩为固定长度摘要,具备单向性、抗第二原像和抗碰撞性。固件校验通常使用 SHA-256 或 SHA-384,BootROM 中还会用到更轻量的 SHA-256 硬件加速器。哈希本身不提供来源认证,它只是“完整性指纹”。

非对称加密基于一对数学关联的密钥:私钥签名/解密,公钥验签/加密。固件场景中主流算法是 ECDSA P-256、Ed25519 与 RSA-3072/4096。ECC 在同等安全强度下密钥更短、验签更快,适合资源受限的 MCU;RSA 则在部分老平台与合规要求下仍被保留。

数字签名是“私钥对哈希摘要的加密变换”,验签方用公钥还原摘要并比对,从而同时获得完整性与来源真实性。固件签名通常采用“先哈希、再签名”的两段式结构,避免对大镜像直接做非对称运算。

关键区分:哈希保证“没被改动”,签名保证“是谁改的且没被改动”,证书保证“这个公钥确实属于某个可信实体”,密钥管理保证“私钥在整个生命周期内不被泄露或滥用”。四者缺一,信任链即断。

二、方法流程:从镜像到可信启动

典型固件签名与验证流程如下:

  1. 构建系统对固件镜像计算 SHA-256 摘要;
  2. 用离线私钥对摘要执行 ECDSA 签名,生成签名块;
  3. 将镜像、签名、签名者证书链打包为签名固件包;
  4. 设备端 BootROM 用内置信任根公钥验证证书链,提取固件签名公钥;
  5. 用该公钥验签镜像摘要,比对本地重算的哈希值;
  6. 校验通过后跳转执行,失败则进入恢复模式或熔断。
# 典型固件签名与验签命令示意
openssl dgst -sha256 -sign fw_priv.pem -out fw.sig fw.bin
openssl dgst -sha256 -verify fw_pub.pem -signature fw.sig fw.bin
# 输出:Verified OK

# 查看证书链
openssl crl2pkcs7 -nocrl -certfile fw_chain.pem | openssl pkcs7 -print_certs -noout

在安全启动中,信任根公钥通常固化在 OTP/eFuse 或 BootROM 中,不可修改。证书链把信任根与固件签名密钥连接起来,使密钥轮换成为可能,而不必更换芯片。

三、案例场景:OTA 升级中的签名与回滚保护

某工业网关通过 OTA 下发固件。服务器用 ECDSA P-256 对镜像签名,设备端 Bootloader 验签后再写入 A/B 分区。为防止攻击者重放旧版本固件,镜像头中携带单调递增的安全版本号,Bootloader 将其与 OTP 中记录的最小版本比较,低于则拒绝启动。这样即使旧固件签名合法,也无法回滚到存在漏洞的版本。

另一个常见场景是产线烧录:工厂使用与研发隔离的签名服务,私钥存放在 HSM 中,签名请求需双人授权并记录审计日志。设备端只持有公钥证书,即使工厂被入侵,攻击者也无法伪造新固件。

四、误区与复盘

  • 误区一:把哈希当签名。只发布 SHA-256 摘要,攻击者可同时替换镜像和摘要,完整性形同虚设。
  • 误区二:私钥硬编码在代码仓库。一旦泄露,所有设备信任链同时失效,必须依赖 OTP 熔断或密钥吊销机制。
  • 误区三:忽略证书有效期与吊销。固件生命周期常达十年,证书过期会导致新固件无法验签,需设计长期信任锚与离线根。
  • 误区四:验签失败后继续启动。必须默认拒绝并进入恢复模式,否则安全启动只是形式。

复盘建议:每次固件发布后,用独立工具重算哈希并验证签名,确认签名对象与发布对象一致;定期演练密钥泄露应急流程,验证吊销与轮换是否可在不召回设备的情况下生效。

五、构件对比与选型清单

构件典型算法固件中的作用关键风险
哈希函数SHA-256 / SHA-384生成镜像摘要,检测篡改碰撞攻击、弱算法残留
非对称加密ECDSA P-256、Ed25519、RSA-3072密钥分发、签名运算基础私钥泄露、随机数质量差
数字签名ECDSA、RSA-PSS来源认证与完整性绑定签名对象与发布对象不一致
证书体系X.509、证书链连接信任根与签名密钥证书过期、链验证缺陷
密钥管理HSM、OTP/eFuse、密钥轮换保护私钥、支持吊销与轮换硬编码、无审计、无法轮换

选型时优先考虑:算法是否被 BootROM 硬件支持、密钥长度是否匹配设备算力、证书链深度是否可控、私钥是否可离线保管、是否支持安全版本号与吊销。只有把哈希、签名、证书与密钥管理作为一个整体设计,固件信任链才真正成立。

固件签名与验证信任链 签名侧(离线/HSM) 固件镜像 fw.bin 版本号 + 负载 SHA-256 摘要 32 字节哈希值 ECDSA 私钥签名 HSM 内完成 签名块 fw.sig r, s 分量 签名固件包 镜像 + 签名 + 证书链 OTA / 烧录 设备端验证侧(BootROM / Bootloader) 信任根公钥 OTP / eFuse 固化 证书链验证 X.509 链式校验 提取固件签名公钥 来自证书链末端 重算镜像 SHA-256 本地摘要 ECDSA 验签 公钥还原摘要 摘要比对 一致则通过 安全版本号检查 防回滚 跳转执行 / 恢复模式 失败则拒绝启动 信任根 → 证书链 → 固件签名公钥 → 镜像摘要 → 安全版本号,任一环节失败即拒绝启动