签名原理:数字签名工作流程归纳总结
咱们直接进入正题。数字签名,说白了就是给APK盖一个电子章,让系统知道这包是谁发的、有没有被人动过。Android的签名流程,本质上是一个“私钥加密、公钥验证”的过程。我最早接触这块的时候,总觉得它和HTTPS的证书有点像,但实际做下来发现坑更多。
一句话概括签名流程
开发者用自己的私钥对APK的摘要做加密,生成签名文件;系统安装时用公钥解密签名,比对摘要是否一致。一致就通过,否则拒绝安装。嗯,就这么简单,但为什么那么多故障?因为细节全在“做什么摘要、怎么放签名、V1/V2/V3怎么兼容”里面。
详细工作流程(7步)
- 计算APK摘要:对整个APK(或分块)用SHA-256等算法算出固定长度的哈希值。
- 签名摘要:用开发者的私钥对摘要进行加密(实际上是签名算法,不是简单加密)。
- 嵌入签名文件:将签名数据和开发者证书(公钥)写入APK的特定位置(META-INF/ 下或APK签名块)。
- 安装时提取:系统解析APK,找到签名块,取出签名数据和证书。
- 用公钥解密签名:得到原始摘要值。
- 重新计算当前APK摘要:对APK做同样的哈希计算,得到新的摘要。
- 比对两个摘要:一致则签名通过,否则报错。
你看,机制本身非常清晰。但实际工作中我踩过不少雷。比如V1签名只对文件列表签名,APK里多一个文件或少一个文件,只要META-INF/ 没变,系统就认。而V2签名是对整个APK字节进行校验,连注释块都不能乱动。有一次我在未重新签名的情况下,直接用zip命令往APK里塞了一个资源文件,结果V2校验直接炸了。从那以后,我养成了只用官方工具修改APK的习惯。
V1、V2、V3签名方案对比
| 方案 | 签名对象 | 存储位置 | 校验范围 | 兼容性 |
|---|---|---|---|---|
| V1 (JAR签名) | 每个文件单独签名 | META-INF/ 证书+SF+RSA | 只校验文件内容,不校验目录结构 | 所有Android版本 |
| V2 (APK签名) | 整个APK的字节 | APK签名块(文件末尾前) | 校验所有字节(除签名块本身) | Android 7.0+ |
| V3 (证书轮换) | 整个APK的字节 + 证书链 | APK签名块(扩展区域) | 同V2,但支持旧证书继承 | Android 9.0+ |
核心经验:如果你的minSdkVersion低于24,并且用了V2签名,低版本设备会直接提示“解析包出错”。记得同时要保留V1签名。我见过某团队只打了V2签,结果Android 6.0手机全部无法安装。
签名流程的关键节点——我画的这张图
下面这张SVG把从开发到安装的整套签名/验证流程画了出来。注意看“摘要比对”那个环节——这是最容易出故障的地方。
签名算法与证书——你真正需要关心的东西
Android支持RSA、ECDSA、DSA三种签名算法。我个人的习惯是选RSA-2048或ECDSA P-256。为啥?DSA在国内用的很少,出问题社区都没人帮你看。ECDSA签名短、性能好,但部分老工具兼容性差。RSA最稳,就是签名块大一点。
证书有效期检查
系统安装APK时还会检查证书有效期。注意:证书过期 并不影响已安装应用的运行,只影响新安装或更新。也就是说,你两年前用过期证书签的APK,今天还能跑,但不能升级。
我自己维护的一个老项目,证书2019年就过期了,用户手机里还留着旧版本,新版本死活装不上,后台报错码全是-2(签名无效)。后来我查了证书,才知道过期了。紧急补签了一个新证书重新发布,才搞定。嗯,从那以后我在项目里加了一个CI脚本,每次构建前检查证书有效期,早发现早处理。
V2签名下的“空摘要”陷阱
还有一个小众但致命的故障。V2签名块里有一个“摘要”字段,它是对APK各个分区的哈希值。如果你手动用二进制编辑工具改了APK里的某个字节但没更新这个摘要,系统一比对肯定失败。更可怕的是,有些自动化打包脚本会在签名后给APK加注释(比如添加渠道信息),嗯,如果你加注释的方式破坏了V2签名块的内容,直接翻车。
说到渠道,其实V2签名设计时也想到了。它允许在APK签名块里插入自定义键值对(ID-value)。你可以把渠道号、更新时间、甚至调试开关写进去,系统安装时根本不关心这些字段,它们也不影响签名验证。比起传统的META-INF里塞文件,这个方案优雅得多。我最近两个版本的项目都用这个方式管理渠道包,研发测试再也没因为渠道问题找我抱怨过。
总结——记住这四点就行
- 密钥是根本:私钥丢了就等于丢了应用的身份,备份好。
- 版本要兼容:minSdkVersion < 24 必须同时打V1+V2签名。
- 摘要不能动:签名后的APK,任何字节都不能改,改了就要重签。
- 证书要监控:设置证书过期提醒,别等到发布日才发现签不了。
好了,这一章把签名原理和工作流程梳理清楚了。后面我们会一个一个来排查那些让你头疼的签名失败问题。做好准备,实战篇更刺激。