3. 密码学基础

物联网设备的安全启动链,本质上是一条“信任传递链”。这条链的每一个环节——从引导加载程序(Bootloader)到内核镜像,再到根文件系统——都必须经过完整性校验与来源认证。而支撑这一切的底层基石,正是密码学中的四大核心组件:哈希函数、非对称加密、数字签名和证书体系。理解它们各自的职责以及如何协同工作,是设计安全启动方案的前提。本章将逐一剖析这些基础概念,并重点说明它们在固件签名场景中的具体落地方式。

固件签名与验证的密码学链路 签名端(安全环境) 固件镜像 (Firmware.bin) SHA-256 哈希计算 私钥签名 (RSA-2048) 固件 + 签名 + 证书链 分发 验证端(设备启动) 接收固件 + 签名 计算哈希 H' 公钥验签 + 证书校验 H' == H ? 启动 : 拒绝 信任根(Root of Trust) 设备内烧录的根证书 (不可更改的信任锚点) Boot ROM 中的公钥哈希 (OTP 熔丝或只读存储) 证书链逐级验证 (根CA → 中间CA → 设备证书) 任何一环失败 → 拒绝启动 信任 图:固件签名与验证的完整链路,左侧为签名端,右侧为验证端,底部为信任根

3.1 哈希函数:完整性校验的基石

哈希函数(Hash Function)是密码学中最基础的工具之一。它将任意长度的输入数据(如整个固件镜像)通过数学变换,映射为固定长度的输出值,称为哈希值或摘要(Digest)。在固件签名场景中,哈希函数的核心价值在于完整性校验——任何一位比特的改变,都会导致哈希值发生不可预测的巨大变化。

核心原理:单向性与抗碰撞性

一个合格的密码学哈希函数必须具备三个关键特性:

  • 单向性(Preimage Resistance):已知哈希值,无法在计算可行的时间内反推出原始输入。这意味着攻击者即使截获了固件的哈希值,也无法据此还原出固件内容。
  • 抗第二原像攻击(Second Preimage Resistance):给定一个输入和它的哈希值,无法找到另一个不同的输入具有相同的哈希值。这防止攻击者用恶意固件替换合法固件但保持哈希不变。
  • 抗碰撞性(Collision Resistance):无法找到任意两个不同的输入具有相同的哈希值。这从概率上保证了不同固件版本不会产生相同的摘要。

在物联网设备中,最常用的哈希算法是 SHA-256(Secure Hash Algorithm 256-bit),它输出 32 字节的摘要。对于安全等级要求更高的场景,也可以使用 SHA-384 或 SHA-512。需要注意的是,MD5 和 SHA-1 已被证明存在碰撞攻击,严禁在安全启动链中使用。

在固件签名中的具体应用

哈希函数在固件签名流程中承担“压缩”角色。由于非对称加密算法(如 RSA)对输入长度有限制(RSA-2048 最多只能加密 245 字节),直接对整个固件(可能几 MB)进行签名是不现实的。因此,标准做法是:

  1. 对固件镜像计算 SHA-256 哈希,得到 32 字节的摘要。
  2. 对摘要进行签名(而非对整个固件)。
  3. 验证时,设备重新计算固件的哈希值,并用公钥解密签名得到原始摘要,两者比对。

这种“哈希+签名”的组合方式,既保证了性能(哈希计算速度快),又保证了安全性(签名保护了摘要的完整性)。

工程要点:在固件签名方案设计时,应明确哈希算法作为签名算法的一部分被固定下来。例如,使用 RSA-PSS 签名时,内部已经嵌入了哈希算法(如 SHA-256)。不要单独对哈希值做“二次哈希”或使用不同的哈希算法进行签名,这会导致兼容性和安全性问题。

3.2 非对称加密:公钥与私钥的分工

非对称加密(Asymmetric Cryptography)使用一对数学上关联但功能不同的密钥:公钥(Public Key)和私钥(Private Key)。公钥可以公开分发,私钥必须严格保密。在固件签名场景中,我们主要利用它的签名与验签能力,而非数据加密。

核心原理:数学单向陷门函数

以最常用的 RSA 算法为例,其安全性基于大整数分解的困难性。密钥生成过程如下:

  1. 选择两个大素数 p 和 q(通常各 1024 位)。
  2. 计算 n = p × q(n 为 2048 位)。
  3. 计算欧拉函数 φ(n) = (p-1)(q-1)。
  4. 选择公钥指数 e(通常为 65537),满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1。
  5. 计算私钥指数 d,满足 d × e ≡ 1 (mod φ(n))。

公钥为 (n, e),私钥为 (n, d)。签名时使用私钥,验签时使用公钥。由于 d 的推导依赖于 p 和 q 的分解,而 n 的分解在计算上不可行,因此私钥无法从公钥推导出来。

固件签名中的密钥管理策略

在物联网设备安全启动中,密钥管理是决定整个系统安全性的关键。常见的策略包括:

密钥类型 存储位置 用途 安全要求
根私钥(Root Private Key) 离线 HSM(硬件安全模块) 签署中间 CA 证书或直接签署固件 永不离开 HSM,物理隔离
固件签名私钥(Code Signing Key) 构建服务器 / HSM 对固件镜像进行签名 访问控制严格,定期轮换
设备公钥(Device Public Key) 设备 Boot ROM / OTP 验证固件签名 只读,不可篡改
风险提示:如果签名私钥泄露,攻击者可以签署任意恶意固件,导致安全启动形同虚设。因此,私钥必须存储在硬件安全模块(HSM)中,并实施严格的访问审计。对于量产设备,公钥通常烧录在一次性可编程(OTP)存储器中,一旦写入便无法修改。

3.3 数字签名:完整性与来源认证的统一

数字签名(Digital Signature)是哈希函数与非对称加密的结合产物。它同时提供了完整性(数据未被篡改)和真实性(数据确实来自声称的签名者)保证。在固件签名中,数字签名是防止恶意固件注入的核心防线。

签名与验签的标准流程

以 RSA-PSS(Probabilistic Signature Scheme)为例,签名过程如下:

  1. 对固件镜像计算 SHA-256 哈希,得到摘要 H。
  2. 使用签名私钥对 H 进行 RSA 运算,生成签名 S。
  3. 将固件镜像、签名 S 以及签名者的证书链打包发布。

设备端验签过程:

  1. 接收固件镜像和签名 S。
  2. 使用预置的公钥对 S 进行 RSA 解密,得到摘要 H'。
  3. 对接收到的固件镜像重新计算 SHA-256 哈希,得到 H''。
  4. 比较 H' 与 H'',若一致则验签通过,否则拒绝启动。

案例拆解:一个典型的固件签名实施

假设某智能摄像头厂商需要为其基于 ARM Cortex-A7 的设备实现安全启动。初始目标:防止攻击者通过 UART 或网络刷入篡改固件。关键约束:设备存储空间有限(8MB NOR Flash),启动时间要求小于 2 秒。

实施步骤:

  1. 在构建服务器上安装 OpenSSL,生成 RSA-2048 密钥对。
  2. 将公钥提取为 DER 格式,烧录到设备 Boot ROM 的 OTP 区域(一次性写入)。
  3. 编写签名脚本,在 CI/CD 流水线中自动对编译产物执行签名:
# 签名脚本示例(使用 OpenSSL)
openssl dgst -sha256 -sign code_signing_private.pem -out firmware.bin.sig firmware.bin
# 生成证书链(根CA → 中间CA → 代码签名证书)
openssl x509 -req -in code_signing.csr -CA intermediate_ca.pem -CAkey intermediate_ca_key.pem -CAcreateserial -out code_signing_cert.pem -days 365
  1. 设备 Boot ROM 启动时,首先读取 OTP 中的根公钥,验证固件签名。
  2. 验签通过后,Boot ROM 才将控制权交给引导加载程序。

结果对比:实施前,攻击者可通过修改 U-Boot 环境变量绕过校验;实施后,任何未签名的固件在 Boot ROM 阶段即被拒绝,启动时间仅增加约 80ms(SHA-256 计算 + RSA 验签)。

复盘经验:签名密钥的轮换机制必须提前规划。如果代码签名证书过期,将导致无法发布新固件。建议使用短期证书(如 1 年)并建立自动续期流程,同时保留旧证书的吊销列表(CRL)以支持旧设备升级。

3.4 证书体系:构建信任链

在复杂的物联网生态中,单一公钥无法满足多产品线、多供应商、多代际设备的灵活管理需求。证书体系(PKI,Public Key Infrastructure)通过引入证书颁发机构(CA),建立了一个分层的信任模型。

X.509 证书结构

固件签名中使用的证书遵循 X.509 v3 标准,核心字段包括:

  • 版本号、序列号:唯一标识证书。
  • 签名算法:如 sha256WithRSAEncryption。
  • 颁发者(Issuer):签发该证书的 CA 名称。
  • 有效期:起始时间和结束时间。
  • 主体(Subject):证书持有者名称。
  • 公钥信息:持有者的公钥及算法。
  • 扩展字段:如 Key Usage(密钥用途)、Basic Constraints(是否为 CA)等。

证书链验证过程

设备端验证固件签名时,需要构建一条从根证书到代码签名证书的信任链:

  1. 设备内置根 CA 证书(信任锚点)。
  2. 固件包中附带中间 CA 证书和代码签名证书。
  3. 设备用根 CA 公钥验证中间 CA 证书的签名。
  4. 用中间 CA 公钥验证代码签名证书的签名。
  5. 最后用代码签名证书的公钥验证固件签名。

任何一级验证失败,整个信任链断裂,固件被拒绝。

常见误区与总结

误区一:将根证书直接用于固件签名。这虽然简化了流程,但一旦根私钥泄露,整个产品线都需要重新烧录信任锚点,灾难性后果。正确做法是使用二级或三级 CA 体系,根 CA 离线存储,仅用于签发中间 CA。
误区二:忽略证书有效期。设备在启动时如果严格校验证书有效期,会导致停产多年的设备因证书过期而无法启动。解决方案:在设备端实现“时间无关验证”,即只验证签名链的数学有效性,不校验时间戳;或者使用长期有效的代码签名证书(如 10 年),并在产品生命周期结束前完成最后一次签名。
最佳实践:在固件签名方案中,建议将证书链直接附加在固件包中,而不是要求设备联网获取。这保证了离线升级场景下的可用性。同时,在证书扩展字段中明确 Key Usage 为 digitalSignature,防止证书被滥用。

总结复盘

密码学基础是安全启动的“物理定律”。哈希函数保证了数据的完整性,非对称加密提供了密钥分发的数学基础,数字签名将两者结合实现了来源认证,而证书体系则解决了大规模部署中的密钥管理问题。在实际工程中,这四者缺一不可,且必须作为一个整体进行设计。任何一环的薄弱——无论是算法选择不当、密钥保护不严,还是证书管理混乱——都可能导致整个安全启动链被攻破。设计者应始终牢记:安全启动的强度取决于最薄弱的环节,而密码学基础正是这条链上最需要扎实构建的部分。