4. 签名与加密基础
在 Android 系统镜像的构建与发布链路中,签名不是“最后点一下按钮”的附属动作,而是决定镜像能否被设备引导加载器接受、能否被 OTA 系统信任、能否被上层应用校验的核心安全机制。理解签名,必须先理解它背后的密码学基础:哈希、非对称加密、数字签名、证书链与密钥库。本章把这些概念放回 Android 镜像签名的真实语境中,帮助你建立“为什么这样签、签的是什么、验的是什么”的完整认知。
一、核心原理:从哈希到非对称加密
哈希算法(如 SHA-256)把任意长度的数据映射为固定长度的摘要。它有三个关键性质:单向性(无法从摘要反推原文)、抗碰撞性(极难找到两段不同数据得到同一摘要)、雪崩效应(输入微小变化导致摘要剧烈变化)。在镜像签名中,哈希的作用是“压缩”:不对几百 MB 甚至几 GB 的镜像直接做非对称运算,而是先算出摘要,再对摘要签名,效率与安全性兼得。
非对称加密使用一对数学关联的密钥:私钥保密、公钥公开。私钥用于签名或解密,公钥用于验签或加密。Android 镜像签名主要使用 RSA 与 ECDSA 两类算法。RSA 依赖大整数分解难题,常见 2048/4096 位;ECDSA 依赖椭圆曲线离散对数难题,密钥更短、性能更好,常见 P-256/P-384。签名时,私钥对“哈希摘要”进行运算生成签名值;验证时,公钥对签名值运算并与本地重新计算的摘要比对,一致则通过。
二、数字签名与证书链
数字签名 = 哈希 + 非对称加密 + 元数据。它回答三个问题:这段镜像是不是持有私钥的人签的(身份认证)、内容有没有被改动(完整性)、签名者能否否认(不可抵赖)。在 Android 中,AVB(Android Verified Boot)使用 vbmeta 结构承载签名信息,boot、system、vendor 等分区的哈希被写入 vbmeta,再由私钥对 vbmeta 签名,形成一条可验证的信任链。
仅有公钥还不够,因为公钥本身也可能被伪造。证书(X.509)把“公钥 + 主体身份 + 有效期 + 用途”绑定,并由上级 CA 用其私钥签名。多个证书首尾相连就构成证书链:根证书(自签名,预置在信任库)→ 中间证书 → 叶证书(实际签名者)。验证时从叶证书逐级向上校验签名,直到命中受信任的根。Android 的 APK 签名方案 v2/v3、OTA 包签名、部分设备密钥都依赖这种链式信任模型。
三、证书链与密钥库:信任如何落地
证书链解决“我凭什么相信这把公钥”。以 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 分区哈希,用内置公钥验签,再决定是否继续引导。
五、误区与复盘
- 误区一:签名等于加密。签名不隐藏内容,只证明来源与完整性。镜像内容仍是明文可读的。
- 误区二:哈希就是签名。哈希没有密钥,任何人都能重算。只有用私钥对哈希签名,才具备认证能力。
- 误区三:换了密钥只是重新签一次。对于 AVB 和 OTA,换密钥意味着设备端信任根必须同步更新,否则新镜像会被拒绝引导,甚至导致设备无法启动。
- 误区四:证书过期无所谓。证书链验证会检查有效期与用途,过期证书可能导致验签失败,需提前规划轮换。
复盘时建议核对三件事:签名算法是否与设备信任配置一致;证书链是否完整且根证书已预置;私钥是否始终处于受控密钥库中。把这三项做成发布前检查清单,可以避免绝大多数签名相关的发布事故。