4. 密码学基础与Snapdragon实现

安全启动的本质,是把“信任”从一段不可篡改的硬件代码,逐级传递到操作系统。这条信任链上,密码学不是装饰,而是每一级验证的判定依据。理解 Snapdragon 安全启动,必须先分清四类算法各自解决什么问题:哈希(SHA)负责度量完整性,非对称签名(RSA/ECDSA)负责证明来源与授权,对称加密(AES)负责保护机密性,而硬件加密引擎负责让这些运算在受控、抗篡改的环境中完成。本节围绕这四类算法,结合 Snapdragon 的实际实现方式展开。

一、SHA:把任意长度的镜像压缩成固定指纹

安全启动验证的第一步不是验签,而是计算摘要。SHA-256 会把任意长度的输入映射为 256 位(32 字节)输出,且具有单向性和抗碰撞性。工程上常见的做法是:对完整镜像计算 SHA-256,得到镜像摘要;再用私钥对该摘要签名。验证方重新计算摘要,并用公钥验证签名是否匹配。

对于大镜像,逐字节读取再一次性哈希并不现实。Snapdragon 引导链通常采用分段哈希 + 哈希表的方式:把镜像切成固定大小的块(例如 4 KB),对每块计算 SHA-256,得到一组块摘要;再对这些块摘要整体计算一次 SHA-256,得到根摘要。验证时先验根摘要,再逐块校验,既支持流式加载,也便于定位损坏块。下面用一段示例说明分段哈希的构造逻辑(参数为教学示例,非实测值):

块大小 = 4096 字节
块0 摘要 = SHA256(镜像[0:4096])
块1 摘要 = SHA256(镜像[4096:8192])
...
根摘要   = SHA256(块0摘要 || 块1摘要 || ... || 块N摘要)
签名对象 = 根摘要

这样,签名只需保护一个 32 字节的根摘要,而根摘要又“锁住”了所有块摘要,块摘要再锁住实际数据,形成层层绑定的完整性结构。

二、RSA 与 ECDSA:签名与验签的两条路线

RSA 和 ECDSA 都是非对称签名算法,但数学基础和工程特性不同。RSA 基于大整数分解难题,常见密钥长度 2048 或 3072 位,签名和验签速度相对较慢,但兼容性极好,广泛用于早期引导 ROM 和固件签名。ECDSA 基于椭圆曲线离散对数难题,256 位密钥即可提供与 RSA 3072 位相当的安全强度,密钥更短、签名更小、运算更快,适合资源受限的引导阶段和移动设备。

在 Snapdragon 安全启动中,通常由高通或 OEM 使用私钥对镜像摘要签名,公钥哈希(Public Key Hash, PKH)则被烧录到芯片的一次性可编程(OTP)区域或由上一级证书签名保护。验证流程可以概括为:

  1. 读取镜像与签名,重新计算镜像摘要;
  2. 用公钥对签名做验签运算,得到签名中恢复的摘要;
  3. 比较两个摘要是否一致;
  4. 同时校验公钥本身是否被信任(PKH 匹配或证书链有效)。

这里有一个容易混淆的点:验签通过只说明“签名与公钥匹配”,并不自动说明“公钥可信”。公钥的可信性必须由 PKH 或证书链单独保证,否则攻击者可以替换公钥和签名,让验签照样通过。这是安全启动设计中最关键的信任锚问题。

三、AES:保护机密性与密钥派生

安全启动主要解决完整性和真实性,但镜像中可能包含密钥、证书或敏感配置,需要 AES 保护机密性。Snapdragon 支持 AES-128/256,常见模式包括 CBC、CTR 和 GCM。GCM 同时提供加密和完整性认证(AEAD),在需要“既保密又防篡改”的场景更合适。

AES 的密钥不能硬编码在镜像里,否则镜像被读取后密钥即泄露。实际做法是:由硬件根密钥(如 QFPROM 中的密钥或硬件密钥派生模块)通过密钥派生函数生成会话密钥,再用于解密镜像。这样,即使镜像被复制到其他设备,也无法解密,因为设备根密钥不同。

四、硬件加密引擎:让密码学在受控边界内执行

Snapdragon 的密码学运算并非全部由应用处理器软件完成。芯片内集成了硬件加密引擎,包括用于对称加密的 Crypto Engine、用于公钥运算的 PKA(Public Key Accelerator)、用于哈希的硬件 SHA 模块,以及负责密钥管理和访问控制的 Security Control Block。它们与 TrustZone 配合,把密钥和运算隔离在安全世界中。

硬件引擎带来的关键收益有三点:第一,密钥不出安全边界,软件只能请求“用某密钥做某运算”,无法直接读取密钥;第二,运算速度更快,RSA/ECDSA 和 AES 都有硬件加速;第三,抗篡改,安全世界与普通世界隔离,普通系统被攻破也不直接暴露根密钥。

下面这张图把本节的核心关系串起来:镜像经过 SHA 得到摘要,摘要由 RSA/ECDSA 私钥签名;验证方用公钥验签,公钥可信性由 PKH/证书链保证;AES 负责镜像机密性;所有关键运算和密钥都由硬件加密引擎与安全世界承载。

Snapdragon 安全启动中的密码学分工 镜像 / 固件 bootloader、TZ、OS 可能含敏感配置 SHA-256 分段哈希 + 根摘要 完整性度量 RSA / ECDSA 私钥签名摘要 公钥验签 信任锚 PKH / OTP 证书链 验证方(引导 ROM / SBL) ① 重算镜像摘要 ② 用公钥验签 ③ 比对摘要 ④ 校验 PKH / 证书链是否可信 AES-128/256 CBC / CTR / GCM 保护镜像机密性 GCM 同时提供认证 硬件加密引擎 + 安全世界 Crypto Engine(AES) PKA(RSA/ECDSA) 硬件 SHA Security Control Block:密钥管理、访问控制 TrustZone 隔离:密钥不出安全边界,抗篡改 调用硬件运算 核心原则:验签通过 ≠ 公钥可信;公钥可信必须由 PKH / 证书链单独保证,密钥运算尽量交给硬件安全边界完成。

五、工程实现中的关键判断

把上述算法落到 Snapdragon 安全启动工程中,需要关注几个实际判断点。第一,算法选择要与芯片能力和引导阶段匹配:早期 ROM 可能只支持 RSA,后续阶段可引入 ECDSA;哈希统一使用 SHA-256 或更强,避免 SHA-1。第二,密钥长度与性能要权衡:RSA 3072 更安全但验签更慢,ECDSA P-256 在移动端更均衡。第三,密钥存储必须依赖硬件:私钥不应出现在普通文件系统,公钥哈希应烧录到 OTP 或由上一级证书保护。第四,验证失败要有明确后果:摘要不匹配、PKH 不匹配、证书链断裂,都应导致启动中止,而不是降级继续。

教学示例:假设某镜像大小为 1 MB,块大小 4 KB,则共有 256 个块。对每块计算 SHA-256 得到 256 个 32 字节摘要,拼接后再哈希得到根摘要。签名对象是根摘要,而不是 1 MB 原始数据。验证时若第 37 块被篡改,其块摘要变化会导致根摘要变化,验签立即失败,从而定位到具体块。

总结来看,SHA 提供完整性度量,RSA/ECDSA 提供来源认证,AES 提供机密性,硬件加密引擎提供受控执行环境,而 PKH/证书链提供信任锚。五者缺一不可,共同构成 Snapdragon 安全启动的密码学基础。理解它们各自的位置和边界,是后续分析具体启动阶段、证书格式和攻击面的前提。