3. 密码学基础
固件可信的根基不在代码本身,而在密码学。固件从出厂到启动的每一步——镜像打包、签名、分发、烧录、上电校验——都依赖四类密码学构件:哈希函数负责“指纹”,非对称加密负责“密钥分发与保密”,数字签名负责“来源与完整性”,证书体系与密钥管理负责“信任锚与生命周期”。理解它们的边界与组合方式,才能设计出既安全又可量产的固件信任链。
一、核心原理:四类构件各司其职
哈希函数把任意长度固件镜像压缩为固定长度摘要,具备单向性、抗第二原像和抗碰撞性。固件校验通常使用 SHA-256 或 SHA-384,BootROM 中还会用到更轻量的 SHA-256 硬件加速器。哈希本身不提供来源认证,它只是“完整性指纹”。
非对称加密基于一对数学关联的密钥:私钥签名/解密,公钥验签/加密。固件场景中主流算法是 ECDSA P-256、Ed25519 与 RSA-3072/4096。ECC 在同等安全强度下密钥更短、验签更快,适合资源受限的 MCU;RSA 则在部分老平台与合规要求下仍被保留。
数字签名是“私钥对哈希摘要的加密变换”,验签方用公钥还原摘要并比对,从而同时获得完整性与来源真实性。固件签名通常采用“先哈希、再签名”的两段式结构,避免对大镜像直接做非对称运算。
关键区分:哈希保证“没被改动”,签名保证“是谁改的且没被改动”,证书保证“这个公钥确实属于某个可信实体”,密钥管理保证“私钥在整个生命周期内不被泄露或滥用”。四者缺一,信任链即断。
二、方法流程:从镜像到可信启动
典型固件签名与验证流程如下:
- 构建系统对固件镜像计算 SHA-256 摘要;
- 用离线私钥对摘要执行 ECDSA 签名,生成签名块;
- 将镜像、签名、签名者证书链打包为签名固件包;
- 设备端 BootROM 用内置信任根公钥验证证书链,提取固件签名公钥;
- 用该公钥验签镜像摘要,比对本地重算的哈希值;
- 校验通过后跳转执行,失败则进入恢复模式或熔断。
# 典型固件签名与验签命令示意
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 硬件支持、密钥长度是否匹配设备算力、证书链深度是否可控、私钥是否可离线保管、是否支持安全版本号与吊销。只有把哈希、签名、证书与密钥管理作为一个整体设计,固件信任链才真正成立。