3. 密码学基础
物联网设备的安全启动链,本质上是一条“信任传递链”。这条链的每一个环节——从引导加载程序(Bootloader)到内核镜像,再到根文件系统——都必须经过完整性校验与来源认证。而支撑这一切的底层基石,正是密码学中的四大核心组件:哈希函数、非对称加密、数字签名和证书体系。理解它们各自的职责以及如何协同工作,是设计安全启动方案的前提。本章将逐一剖析这些基础概念,并重点说明它们在固件签名场景中的具体落地方式。
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)进行签名是不现实的。因此,标准做法是:
- 对固件镜像计算 SHA-256 哈希,得到 32 字节的摘要。
- 对摘要进行签名(而非对整个固件)。
- 验证时,设备重新计算固件的哈希值,并用公钥解密签名得到原始摘要,两者比对。
这种“哈希+签名”的组合方式,既保证了性能(哈希计算速度快),又保证了安全性(签名保护了摘要的完整性)。
3.2 非对称加密:公钥与私钥的分工
非对称加密(Asymmetric Cryptography)使用一对数学上关联但功能不同的密钥:公钥(Public Key)和私钥(Private Key)。公钥可以公开分发,私钥必须严格保密。在固件签名场景中,我们主要利用它的签名与验签能力,而非数据加密。
核心原理:数学单向陷门函数
以最常用的 RSA 算法为例,其安全性基于大整数分解的困难性。密钥生成过程如下:
- 选择两个大素数 p 和 q(通常各 1024 位)。
- 计算 n = p × q(n 为 2048 位)。
- 计算欧拉函数 φ(n) = (p-1)(q-1)。
- 选择公钥指数 e(通常为 65537),满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1。
- 计算私钥指数 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 | 验证固件签名 | 只读,不可篡改 |
3.3 数字签名:完整性与来源认证的统一
数字签名(Digital Signature)是哈希函数与非对称加密的结合产物。它同时提供了完整性(数据未被篡改)和真实性(数据确实来自声称的签名者)保证。在固件签名中,数字签名是防止恶意固件注入的核心防线。
签名与验签的标准流程
以 RSA-PSS(Probabilistic Signature Scheme)为例,签名过程如下:
- 对固件镜像计算 SHA-256 哈希,得到摘要 H。
- 使用签名私钥对 H 进行 RSA 运算,生成签名 S。
- 将固件镜像、签名 S 以及签名者的证书链打包发布。
设备端验签过程:
- 接收固件镜像和签名 S。
- 使用预置的公钥对 S 进行 RSA 解密,得到摘要 H'。
- 对接收到的固件镜像重新计算 SHA-256 哈希,得到 H''。
- 比较 H' 与 H'',若一致则验签通过,否则拒绝启动。
案例拆解:一个典型的固件签名实施
假设某智能摄像头厂商需要为其基于 ARM Cortex-A7 的设备实现安全启动。初始目标:防止攻击者通过 UART 或网络刷入篡改固件。关键约束:设备存储空间有限(8MB NOR Flash),启动时间要求小于 2 秒。
实施步骤:
- 在构建服务器上安装 OpenSSL,生成 RSA-2048 密钥对。
- 将公钥提取为 DER 格式,烧录到设备 Boot ROM 的 OTP 区域(一次性写入)。
- 编写签名脚本,在 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
- 设备 Boot ROM 启动时,首先读取 OTP 中的根公钥,验证固件签名。
- 验签通过后,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)等。
证书链验证过程
设备端验证固件签名时,需要构建一条从根证书到代码签名证书的信任链:
- 设备内置根 CA 证书(信任锚点)。
- 固件包中附带中间 CA 证书和代码签名证书。
- 设备用根 CA 公钥验证中间 CA 证书的签名。
- 用中间 CA 公钥验证代码签名证书的签名。
- 最后用代码签名证书的公钥验证固件签名。
任何一级验证失败,整个信任链断裂,固件被拒绝。
常见误区与总结
digitalSignature,防止证书被滥用。
总结复盘
密码学基础是安全启动的“物理定律”。哈希函数保证了数据的完整性,非对称加密提供了密钥分发的数学基础,数字签名将两者结合实现了来源认证,而证书体系则解决了大规模部署中的密钥管理问题。在实际工程中,这四者缺一不可,且必须作为一个整体进行设计。任何一环的薄弱——无论是算法选择不当、密钥保护不严,还是证书管理混乱——都可能导致整个安全启动链被攻破。设计者应始终牢记:安全启动的强度取决于最薄弱的环节,而密码学基础正是这条链上最需要扎实构建的部分。