目录

简介

APK v1

APK v2

APK v3

APK v4

总结


简介

大部分开发者对apk签名还停留在APK v2,对APK v3和APK v4了解很少,而且网上大部分文章讲解的含糊不清,所以根据官网文档重新整理一份。

apk签名从APK v1到APK v2改动很大,是颠覆性的,而APK v3只是对APK v2的一次升级,APK v4则是一个补充。

本篇文章主要参考Android各版本改动:

https://developer.android.google.cn/about/versions/pie/

APK v1

就是jar签名,apk最初的签名方式,大家都很熟悉了,签名完之后是META-INF 目录下的三个文件:MANIFEST.MF、CERT.SF、CERT.RSA。

MANIFEST.MF中是apk种每个文件名称和摘要SHA1(或者 SHA256),如果是目录则只有名称

CERT.SF则是对MANIFEST.MF的摘要,包括三个部分:

  • SHA1-Digest-Manifest-Main-Attributes:对 MANIFEST.MF 头部的块做 SHA1(或者SHA256)后再用 Base64 编码

  • SHA1-Digest-Manifest:对整个 MANIFEST.MF 文件做 SHA1(或者 SHA256)后再用 Base64 编码

  • SHA1-Digest:对 MANIFEST.MF 的各个条目做 SHA1(或者 SHA256)后再用 Base64 编码

CERT.RSA是将CERT.SF通过私钥签名,然后将签名以及包含公钥信息的数字证书一同写入 CERT.RSA 中保存

通过这三层校验来确保apk中的每个文件都不被改动。

APK v2

官方说明:https://source.android.google.cn/security/apksigning/v2

APK 签名方案 v2 是在 Android 7.0 (Nougat) 中引入的。为了使 APK 可在 Android 6.0 (Marshmallow) 及更低版本的设备上安装,应先使用 JAR 签名功能对 APK 进行签名,然后再使用 v2 方案对其进行签名。

APK v1的缺点就是META-INF目录下的文件并不在校验范围内,所以之前多渠道打包等都是通过在这个目录下添加文件来实现的。

APK 签名方案 v2 是一种全文件签名方案,该方案能够发现对 APK 的受保护部分进行的所有更改,从而有助于加快验证速度并增强完整性保证。

使用 APK 签名方案 v2 进行签名时,会在 APK 文件中插入一个 APK 签名分块,该分块位于“ZIP 中央目录”部分之前并紧邻该部分。在“APK 签名分块”内,v2 签名和签名者身份信息会存储在 APK 签名方案 v2 分块中。

通俗点说就是签名信息不再以文件的形式存储,而是将其转成二进制数据直接写在apk文件中,这样就避免了APK v1的META-INF目录的问题。

在 Android 7.0 及更高版本中,可以根据 APK 签名方案 v2+ 或 JAR 签名(v1 方案)验证 APK。更低版本的平台会忽略 v2 签名,仅验证 v1 签名。

APK v3

官方说明:https://source.android.google.cn/security/apksigning/v3

APK 签名方案 v3 是在 Android 9 中引入的。

Android 9 支持 APK 密钥轮替,这使应用能够在 APK 更新过程中更改其签名密钥。为了实现轮替,APK 必须指示新旧签名密钥之间的信任级别。为了支持密钥轮替,我们将 APK 签名方案从 v2 更新为 v3,以允许使用新旧密钥。v3 在 APK 签名分块中添加了有关受支持的 SDK 版本和 proof-of-rotation 结构的信息。

简单来说APK v3就是为了Andorid9的APK 密钥轮替功能而出现的,就是在v2的基础上增加两个数据块来存储APK 密钥轮替所需要的一些信息,所以可以看成是v2的升级。具体结构见官网说明即可。

APK 密钥轮替功能可以参考:https://developer.android.google.cn/about/versions/pie/android-9.0

具有密钥轮转的 APK 签名方案

Android 9 新增了对 APK Signature Scheme v3 的支持。该架构提供的选择可以在其签名块中为每个签名证书加入一条轮转证据记录。利用此功能,应用可以通过将 APK 文件过去的签名证书链接到现在签署应用时使用的证书,从而使用新签名证书来签署应用。

https://developer.android.google.cn/about/versions/pie/android-9.0

注:运行 Android 8.1(API 级别 27)或更低版本的设备不支持更改签名证书。如果应用的 minSdkVersion 为 27 或更低,除了新签名之外,可使用旧签名证书来签署应用。

详细了解如何使用 apksigner 轮转密钥参考:https://developer.android.google.cn/studio/command-line/apksigner#usage-rotate

在 Android 9 及更高版本中,可以根据 APK 签名方案 v3、v2 或 v1 验证 APK。较旧的平台会忽略 v3 签名而尝试验证 v2 签名,然后尝试验证 v1 签名。

APK v4

官方说明:https://source.android.google.cn/security/apksigning/v4

APK 签名方案 v4 是在 Android 11 中引入的。

Android 11 通过 APK 签名方案 v4 支持与流式传输兼容的签名方案。v4 签名基于根据 APK 的所有字节计算得出的 Merkle 哈希树。它完全遵循 fs-verity 哈希树的结构(例如,对salt进行零填充,以及对最后一个分块进行零填充。)Android 11 将签名存储在单独的 .apk.idsig 文件中。v4 签名需要 v2 或 v3 签名作为补充。

APK v4同样是为了新功能而出现的,这个新功能就是ADB 增量 APK 安装,可以参考Android11 功能和 API 概览:

https://developer.android.google.cn/about/versions/11/features

ADB 增量 APK 安装

在设备上安装大型(2GB 以上)APK 可能需要很长的时间,即使应用只是稍作更改也是如此。ADB(Android 调试桥)增量 APK 安装可以安装足够的 APK 以启动应用,同时在后台流式传输剩余数据,从而加速这一过程。如果设备支持该功能,并且您安装了最新的 SDK 平台工具,adb install 将自动使用此功能。如果不支持,系统会自动使用默认安装方法。

https://developer.android.google.cn/about/versions/11/features

运行以下 adb 命令以使用该功能。如果设备不支持增量安装,该命令将会失败并输出详细的解释。

adb install --incremental

在运行 ADB 增量 APK 安装之前,您必须先为 APK 签名并创建一个 APK 签名方案 v4 文件。必须将 v4 签名文件放在 APK 旁边,才能使此功能正常运行。

https://developer.android.google.cn/about/versions/11/features

因为需要流式传输,所以需要将文件分块,对每一块进行签名以便校验,使用的方式就是Merkle 哈希树(https://www.kernel.org/doc/html/latest/filesystems/fsverity.html#merkle-tree),APK v4就是做这部分功能的。所以APK v4与APK v2或APK v3可以算是并行的,所以APK v4签名后还需要 v2 或 v3 签名作为补充。

运行 adb install --incremental 命令时,adb 会要求 .apk.idsig 文件存在于 .apk 旁边(所以APK v4的签名文件.apk.idsig并不会打包进apk文件中)

默认情况下,它还会使用 .idsig 文件尝试进行增量安装;如果此文件缺失或无效,该命令会回退到常规安装。

总结

细说Android apk四代签名:APK v1、APK v2、APK v3、APK v4相关推荐

  1. Googlenet v1、v2、v3、v4区别

    Googlenet v1.v2.v3.v4区别 Inception v1的网络,将1x1,3x3,5x5的conv和3x3的pooling,stack在一起,一方面增加了网络的width,另一方面增加 ...

  2. 【Android签名机制详解】二:Android V1、V2、V3、V4签名方案

    前言 书接上回[Android签名机制详解]一:密码学入门,在了解了消息摘要.非对称加密.数字签名.数字证书的基本概念后,我们趁热打铁.直奔主题,讲解签名在Android中的实际应用. 基础知识 An ...

  3. [计算机视觉]-经典网络inception v1、v2、v3、v4核心工作详解及总结

    资源 inception v1 Going deeper with convolutions:https://arxiv.org/abs/1409.4842 BN算法 Batch Normalizat ...

  4. Android v1、v2、v3签名原理

    Android签名机制 什么是Android签名 了解 HTTPS 通信的同学都知道,在消息通信时,必须至少解决两个问题:一是确保消息来源的真实性,二是确保消息不会被第三方篡改. 同理,在安装 apk ...

  5. 面试:Android 签名校验机制 v1、v2、v3

    探究 Android 签名机制和原理 - 腾讯云开发者社区-腾讯云 一.APK签名可以带来以下好处 应用程序升级 如果想无缝升级一个应用,Android系统要求应用程序的新版本与老版本具有相同的签名与 ...

  6. 计算机视觉——YOLO(v1,v2,v3)

    计算机视觉--YOLO(v1,v2,v3) 1.YOLO V1 1.1论文思想 1.2.YOLO V1 网络结构 1.3.YOLO V1 损失函数 1.4.YOLO V1 存在的问题 2.YOLO V ...

  7. Andriod Studio两种签名机制V1和V2的区别

    Android Studio 2.2以上版本打包apk的时候,我们会发现多了个签名版本(v1.v2)选择,如下图红色方框所示 问题描述(v1和v2) Android 7.0中引入了APK Signat ...

  8. YOLO V1,V2, V3的记录

    YOLO V1写的比较好的 https://zhuanlan.zhihu.com/p/378508 模型的输出需要固度维度,看模型的网络结构,可以知道固定维度是. 具体的方法是将输入图像按照模型的输出 ...

  9. Mobile net系列总结(V1、V2、V3)

    一.Mobile Net V1 主要贡献: (1)使用了深度可分离卷积构建轻量级卷积神经网络,由depthwise(DW)和pointwise(PW)两个部分结合起来,用来提取特征feature ma ...

最新文章

  1. HTML+CSS+JavaScript复习笔记持更(十)——CSS3常用属性之定位
  2. 清华大学计算机系男女,【清华大学男女比例】2016清华大学各院系男女比例
  3. 自动化专业学python有用吗-马哥教育官网-专业Linux培训班,Python培训机构
  4. Java中Comparator和Comparable之间的区别
  5. python package_python之package定义
  6. view工作原理-计算视图大小的过程(onMeasure)
  7. 他受他爸影响,他爸受数学家影响,最终造出了自动旋转的房子!
  8. 关系模式候选键求取的算法
  9. matlab 拟合保存函数,matlab如何拟合函数
  10. 如何在WORD中给数字加上圈,教程在这里,怎么在WORD中给数字加圈
  11. cad没有命令输入框_cad怎么调出命令栏(cad下面的命令行没有了,如何调出来?)...
  12. 计算机断电无法启动不了系统,电脑突然断电后无法启动怎么回事
  13. 优秀的linux学习网站
  14. 网络安全策略和网络安全机制
  15. 鸿蒙电视厂商多少人,国产厂商崛起?鸿蒙之后这家厂商也推送了新系统,体验极佳...
  16. u盘iso安装服务器系统怎么安装win7系统安装系统教程,u盘iso安装系统,小编教你u盘怎么安装win7系统...
  17. rrpp+ospf环网组建
  18. Qt之标签和单行文本编辑框(QLabel、QLineEdit)
  19. python记时命令
  20. Apache URL重定向指南

热门文章

  1. EasyUI 分页 简洁代码
  2. Thrift IDL基本语法
  3. Redis 常用监控信息命令总结
  4. BZOJ3123: [Sdoi2013]森林
  5. nginx+ssl+pm2 部署 nodejs 服务
  6. 第一次刷Leetcode,为什么耗费很多时间
  7. python-mysql驱动64位
  8. Vr-Vantage之场景与环境
  9. 浮动5-常用列表显示(案例)
  10. 小程序中神秘的用户数据