v1(JAR)签名方案:老设备兼容的底座
它是怎么工作的
v1 方案沿用了 Java JAR 的签名传统:对 APK 压缩包里的每个文件条目分别计算摘要,签名信息写进包内 META-INF 目录。安装时系统逐条比对,任何一个文件对不上就拒绝安装。
为什么它还在
一个字:兼容。v1 是唯一被所有安卓版本接受的方案。目标设备里如果有 Android 6 或更早的机器,包里必须带 v1 签名,否则这些设备根本不走后面的校验流程,直接装不上。
它的固有弱点
逐条目校验留下了一个经典攻击面:v1 只保证"包内各文件未被改动",不约束 zip 结构本身——历史上著名的 Janus 类漏洞正是利用这一点,在保留合法签名条目的前提下改动包结构。这也是 Android 7.0 引入 v2 整包校验的直接动因,详见v2 方案。
什么包该带 v1
- 目标覆盖老设备:minSdkVersion 低于 24(Android 7.0)的包,v1 必选。
- 来源不明的三方包重签:你不知道它会被传到什么设备上,带 v1 是保险。
- 纯新设备分发:确认只在 7.0 以上环境安装的包,可以省掉 v1,减少被老攻击面利用的机会。
在 apk-signer 里怎么控制
签名设置里 v1/v2 各有开关(v3、v4 开关自 6.10.0 加入,见签名方案全景)。开关的默认组合以应用当前版本为准;组合策略的推荐见v1+v2 为什么是稳妥默认。