App 签名过时或泄露怎么办?别担忧,Google 已经给出解决方案!

1、序

在将 App 发布到市场以前,很重要的一个步骤就是为 APK 进行签名,大部分时候,这个操做隐藏在了打包的流程中,而不被咱们注意到。android

签名的做用,除了证实 App 的全部权以外,还能够帮助 Android 市场和设备校验 APK 的正确性git

Android 签名是自证实的,并不会对证书进行 CA 认证。也就是咱们可使用工具自行生成签名证书,只要是一个正确的签名,系统就会认可,而且容许安装。github

生成签名的时,能够指定一个有效时间,这个时间默认为 25 年,而且 Google Play 也有硬性规定,上架的 App 签名有效期必须在 2033-10-22 日期以后。因此只要不是手欠修改了这个有效期,在当下这个时刻,是不会有问题,毕竟到如今尚未一款 App 存在 25 年。数组

有些问题不在眼前,倒是真实存在的。对于一款上架的 App,最重要的就是用户,而当签名失效以后,咱们只能被迫换签名,此时由于签名校验没法经过,就会致使旧用户没法覆盖安装。这些历史用户惟一的选择,就是卸载后从新安装。安全

好在这不只仅是你个人问题,天塌下来有个子高的顶着,因此别担忧,Google 已经着手在解决这个问题了。工具

方案就是 Android 9.0 新增的对 APK V3 签名的支持。学习

2、新的签名方案 V3

2.1 Android 的签名方案

Android 的签名方案,发展到如今,不是一蹴而就的。Android 如今已经支持三种应用签名方案:ui

  • V1 方案:基于 JAR 签名。
  • V2 方案:APK 签名方案 V2,在 Android 7.0 引入。
  • V3 方案:APK 签名方案 V3,在 Android 9.0 引入。

V1 到 V2 是颠覆性的,为了解决 JAR 签名方案的安全性问题,而到了 V3 方案,其实结构上并无太大的调整,能够理解为 V2 签名方案的升级版,有一些资料也把它称之为 V2+ 方案。spa

由于这种签名方案的升级,就是向下兼容的,因此只要使用得当,这个过程对开发者是透明的。blog

V1 到 V2 方案的升级,对开发者影响最大的,就是渠道签署的问题。在当下这个大环境下,咱们想让不一样渠道、市场的安装包有所区别,携带渠道的惟一标识,这就是咱们俗称的渠道包。好在各大厂都开源了本身的签渠道方案,例如:Walle(美团)、VasDolly(腾讯)都是很是优秀的方案,想了解的能够先看看以前的文章:《Android 签名和多渠道打包原理》。

2.2 签名的历史

先从 Android 签名的历史讲起。

在上个世纪 80 年代,Phil Katz 建立了 ZIP 格式,能够将文件和一些元数组,组合在一个文件中,便于传输和存档,该格式是为了解决压缩、校验和冗余头等问题而提出的解决方案。

Sum 公司在上世纪 90 年代,将 ZIP 做为 JAR 格式的基础,而 JAR 本质上就是一个 ZIP 存档。在其中,META-INF 目录下会包含一些元数据和签名数据等信息。

Android 出现后,也沿用了 Java 的 JAR 的发布方式,将 APK 创建在 JAR 格式之上,在此基础上对 Dalvik 字节码 classes.dex 和资源 resources.arsc 等文件添加更多标准化的结构。当时 Android 的 APK 彻底依赖 JAR 的签名方案来确保应用程序的正确性,这就是咱们俗称的 V1 方案(JAR 方案)。

在 V1 签名方案中,并不会保护 APK 内的全部文件,会存在一些例外部分,即使被修改也不会致使签名失效,例如:ZIP 元数据。同时,V1 方案对 APK 内部被保护的原始文件,是单独进行计算数据摘要的,因此在验证时,须要先解压再验证,致使安装时会花费更多的时间,消耗更多的内存。例如 V1 方案中签渠道的方式就是利用了此特性,将渠道信息写入 META-INF 文件中,这不会破坏 V1 签名。

image

多年后,在 Android 7.0 中添加了一种新的签名方式,就是咱们俗称的 V2 方案。V2 签名提供了更强大的 APK 文件验证,它再也不检查包内单个文件,而是检查整个 APK。它在 ZIP 文件中,插入一个额外的签名块,覆盖 ZIP 文件中的其他部分。

在这个额外的签名块(Apk Signature Block V2)中,会对当前 APK 的其余部分签名。

从安全的角度 V2 会比 V1 更安全,V2 签名是验证整个打包后的 APK 文件,因此对其 APK 文件作“任何”改动都会破坏签名。注意这里的任何是带引号的,V2 签名的签名块实际上是一个 K-V 的结构,能够向其中插入一些简单的数据而不破坏 V2 签名,这就是 V2 方案下,多渠道的方案思路。

在引入 V2 方案的同时,也保证了向后兼容,旧的 JAR 签名方案仍然在旧的设备(Android 7.0 如下)中生效,而在较新的设备上,也会判断是否使用 V2 签名,不是则依然会去校验 V1 签名。

V2 方案解决了安全问题以及安装时验证的效率问题,可是它并无解决前面提到的换签名问题。

2.3 Android 的 V3 方案

Android 9.0 中引入了新的签名方式,它的格式大致和 V2 相似,在 V2 插入的签名块(Apk Signature Block V2)中,又添加了一个新快(Attr块)。

在这个新块中,会记录咱们以前的签名信息以及新的签名信息,以密钥转轮的方案,来作签名的替换和升级。这意味着,只要旧签名证书在手,咱们就能够经过它在新的 APK 文件中,更改签名。

V3 签名新增的新块(attr)存储了全部的签名信息,由更小的 Level 块,以链表的形式存储。

其中每一个节点都包含用于为以前版本的应用签名的签名证书,最旧的签名证书对应根节点,系统会让每一个节点中的证书为列表中下一个证书签名,从而为每一个新密钥提供证据来证实它应该像旧密钥同样可信。

这个过程有点相似 CA 证书的证实过程,已安装的 App 的旧签名,确保覆盖安装的 APK 的新签名正确,将信任传递下去。

2.4 V3 签名的验证过程

Android 的签名方案,不管怎么升级,都是要确保向下兼容。

在引入 V3 方案后,Android 9.0 及更高版本中,能够根据 APK 签名方案,V3 → V2 → V1 依次尝试验证 APK。而较旧的平台会忽略 V3 签名并尝试 V2 签名,最后才去验证 V1 签名。

整个验证的过程,以下图:

须要注意的是,对于覆盖安装的状况,签名校验只支持升级,而不支持降级。也就是说设备上安装了一个使用 V1 签名的 Apk,可使用 V2 签名的 Apk 进行覆盖安装,反之则不容许。

3、总结时刻

Android 签名替换的问题,Google 已经在考虑了,9.0 新增的 V3 签名方案就是为了解决签名替换的。这些,确定都是提早准备。

签名过时的问题,不须要太担忧,咱们只须要跟着 Google 的步伐就能够了。

最后小结一下结论,签名过时的问题,在 Android 9.0 上新支持的 V3 签名,已经有解决的方案了。另外:

  1. V1 签名遵循 JAR 的签名方式,单独验证 APK 压缩包中的文件。
  2. V2 签名是针对 APK 文件的验证,将签名信息写入签名块中,加强了安全性和验证效率。
  3. V3 签名在签名块中又增长了新块(attr),由更小的 level 块,以链表的形式存储多个证书。
  4. 在 V3 方案中,最旧的证书为新块链表的根节点,以此对新证书签名,确保新证书正确有效。

V3 方案尚未正式开放,在最新版的 Build Tools 版本 28.0.3 中的 Apksigner,尚不支持 V3 的 APK 签名方案。想尝鲜能够经过源代码自行编译。

从现有的资料来看,我比较关心的多渠道打包的支持方案,在升级到 V3 以后,旧的 V2 支持的多渠道方案应该依然有效(或者少许改动)。

期待上线后的具体效果。

你对 V3 签名有什么想法或者疑问,欢迎在留言区讨论。如若本文对你有所帮助,欢迎留言、转发、点赞

reference:

Android APK signature scheme V3

Android Doc:应用签名

Android P V3 签名新特性


公众号后台回复成长『 成长』,将会获得我准备的学习资料,也能回复『 加群』,一块儿学习进步;你还能回复『 提问』,向我发起提问。

相关文章
相关标签/搜索