4. 签名与加密基础

在 Android 系统镜像的构建与发布链路中,签名不是“最后点一下按钮”的附属动作,而是决定镜像能否被设备引导加载器接受、能否被 OTA 系统信任、能否被上层应用校验的核心安全机制。理解签名,必须先理解它背后的密码学基础:哈希、非对称加密、数字签名、证书链与密钥库。本章把这些概念放回 Android 镜像签名的真实语境中,帮助你建立“为什么这样签、签的是什么、验的是什么”的完整认知。

一、核心原理:从哈希到非对称加密

哈希算法(如 SHA-256)把任意长度的数据映射为固定长度的摘要。它有三个关键性质:单向性(无法从摘要反推原文)、抗碰撞性(极难找到两段不同数据得到同一摘要)、雪崩效应(输入微小变化导致摘要剧烈变化)。在镜像签名中,哈希的作用是“压缩”:不对几百 MB 甚至几 GB 的镜像直接做非对称运算,而是先算出摘要,再对摘要签名,效率与安全性兼得。

非对称加密使用一对数学关联的密钥:私钥保密、公钥公开。私钥用于签名或解密,公钥用于验签或加密。Android 镜像签名主要使用 RSA 与 ECDSA 两类算法。RSA 依赖大整数分解难题,常见 2048/4096 位;ECDSA 依赖椭圆曲线离散对数难题,密钥更短、性能更好,常见 P-256/P-384。签名时,私钥对“哈希摘要”进行运算生成签名值;验证时,公钥对签名值运算并与本地重新计算的摘要比对,一致则通过。

关键区分:加密是“用公钥加密、私钥解密”,目的是保密;签名是“用私钥签名、公钥验签”,目的是认证与完整性。Android 镜像签名属于后者,不提供保密性,只保证来源可信与内容未被篡改。

二、数字签名与证书链

数字签名 = 哈希 + 非对称加密 + 元数据。它回答三个问题:这段镜像是不是持有私钥的人签的(身份认证)、内容有没有被改动(完整性)、签名者能否否认(不可抵赖)。在 Android 中,AVB(Android Verified Boot)使用 vbmeta 结构承载签名信息,boot、system、vendor 等分区的哈希被写入 vbmeta,再由私钥对 vbmeta 签名,形成一条可验证的信任链。

仅有公钥还不够,因为公钥本身也可能被伪造。证书(X.509)把“公钥 + 主体身份 + 有效期 + 用途”绑定,并由上级 CA 用其私钥签名。多个证书首尾相连就构成证书链:根证书(自签名,预置在信任库)→ 中间证书 → 叶证书(实际签名者)。验证时从叶证书逐级向上校验签名,直到命中受信任的根。Android 的 APK 签名方案 v2/v3、OTA 包签名、部分设备密钥都依赖这种链式信任模型。

Android 镜像签名与验证的密码学链路 签名侧(构建机 / 私钥环境) 镜像数据 boot / system / vendor 原始字节流,可能数百 MB ~ 数 GB 哈希算法 SHA-256 输出固定 32 字节摘要,抗碰撞 私钥签名 RSA / ECDSA 对摘要运算,生成签名值 vbmeta / APK 签名块 摘要 + 签名 + 证书链 + 算法标识 随镜像一起发布 发布 验证侧(设备引导 / 安装器) 接收镜像 + 签名块 从 vbmeta / APK 中提取 重新计算哈希 SHA-256 对收到的镜像数据本地计算 公钥验签 用证书链中的公钥还原摘要 比对两个摘要 一致 → 放行;不一致 → 拒绝启动 / 安装 信任链逐级校验至根证书

三、证书链与密钥库:信任如何落地

证书链解决“我凭什么相信这把公钥”。以 Android 平台签名为例,Google 持有根 CA,签发中间 CA,中间 CA 再签发各设备厂商或发布者的叶证书。设备端预置根证书,验证时逐级回溯。任何一级签名不匹配、证书过期或用途不符,整条链即判定失败。

密钥库(Keystore)是私钥与证书的安全容器。Android 生态中常见三类:Java KeyStore(JKS/PKCS12,用于 APK 签名)、Android Keystore(设备硬件级密钥存储,用于运行时密钥)、以及构建系统使用的密钥文件(如 AVB 的 .pem/.pk8)。密钥库的核心价值是:私钥永不以明文出现在构建脚本或日志中,访问受口令或硬件保护。

概念 作用 Android 中的典型载体 常见算法/格式
哈希 压缩数据、检测篡改 vbmeta 中的分区摘要、APK 摘要 SHA-256、SHA-512
非对称加密 提供公私钥对,支撑签名与验签 AVB 签名密钥、APK 签名密钥 RSA-2048/4096、ECDSA P-256
数字签名 认证来源、保证完整性、不可抵赖 vbmeta 签名、APK Signature Scheme v2/v3 RSASSA-PKCS1、ECDSA
证书链 把公钥绑定到可信身份 OTA 包签名、设备密钥证明 X.509 v3
密钥库 安全保存私钥与证书 JKS/PKCS12、Android Keystore .jks、.p12、.pk8、.pem

四、实操场景:一次 AVB 签名命令拆解

下面是一条典型的 AVB 镜像签名命令,它把本章概念全部串了起来:

avbtool add_hash_footer \
  --image system.img \
  --partition_name system \
  --partition_size 2147483648 \
  --algorithm SHA256_RSA2048 \
  --key release_key.pem \
  --salt 0x5f3a... \
  --rollback_index 1

逐项对应:--algorithm SHA256_RSA2048 表示哈希用 SHA-256、签名用 RSA-2048;--key release_key.pem 是私钥文件,属于密钥库范畴;--salt 防止相同镜像产生相同摘要,抵御预计算攻击;--rollback_index 用于防回滚,属于签名元数据的一部分。设备启动时,引导加载器读取该 footer,重新计算 system 分区哈希,用内置公钥验签,再决定是否继续引导。

实践建议:私钥文件权限应设为 600,构建机与发布机分离;签名操作应在受控环境执行,避免私钥进入 CI 缓存或制品库。

五、误区与复盘

  • 误区一:签名等于加密。签名不隐藏内容,只证明来源与完整性。镜像内容仍是明文可读的。
  • 误区二:哈希就是签名。哈希没有密钥,任何人都能重算。只有用私钥对哈希签名,才具备认证能力。
  • 误区三:换了密钥只是重新签一次。对于 AVB 和 OTA,换密钥意味着设备端信任根必须同步更新,否则新镜像会被拒绝引导,甚至导致设备无法启动。
  • 误区四:证书过期无所谓。证书链验证会检查有效期与用途,过期证书可能导致验签失败,需提前规划轮换。

复盘时建议核对三件事:签名算法是否与设备信任配置一致;证书链是否完整且根证书已预置;私钥是否始终处于受控密钥库中。把这三项做成发布前检查清单,可以避免绝大多数签名相关的发布事故。

安全底线:私钥一旦泄露,攻击者可以签出被设备信任的恶意镜像。密钥库的访问控制、备份策略与轮换机制,必须与镜像发布流程同等重视。