APK 签名:v1 v2 v3 v4

APK 签名:v1 v2 v3 v4通过对Apk进行签名,开发者可以证明对Apk的所有权和控制权,可用于安装和更新其应用。而在Android设备上的安装Apk,如果是一个没有被签名的Apk,则会被拒绝安装。在安装Apk的时候,软件包管理器也会验证Apk是否已经被正确签名,并且通过签名证书和数据摘要验证是否合法没有被篡改。只有确认安全无篡改的情况下,才允许安装在设备上。简单来说,APK的签名主要作用有两个:证明APK的所有者。 允许Android市场和设备校验APK的正确性。

大家好,又见面了,我是你们的朋友全栈君。

通过对 Apk 进行签名,开发者可以证明对 Apk 的所有权和控制权,可用于安装和更新其应用。而在 Android 设备上的安装 Apk ,如果是一个没有被签名的 Apk,则会被拒绝安装。

在安装 Apk 的时候,软件包管理器也会验证 Apk 是否已经被正确签名,并且通过签名证书和数据摘要验证是否合法没有被篡改。只有确认安全无篡改的情况下,才允许安装在设备上。

简单来说,APK 的签名主要作用有两个:

  1. 证明 APK 的所有者。
  2. 允许 Android 市场和设备校验 APK 的正确性。

Android 目前支持以下四种应用签名方案:

  • v1 方案:基于 JAR 签名。
  • v2 方案:APK 签名方案 v2(在 Android 7.0 中引入)

v1 到 v2 是颠覆性的,为了解决 JAR 签名方案的安全性问题,而到了 v3 方案,其实结构上并没有太大的调整,可以理解为 v2 签名方案的升级版,有一些资料也把它称之为 v2+ 方案。

JAR 签名(v1 方案)

V1 签名的机制主要就在 META-INF 目录下的三个文件,MANIFEST.MF,CERT.SF,CERT.RSA,他们都是 V1 签名的产物。

在 V1 签名方案中,并不会保护 APK 内的所有文件,会存在一些例外部分,即便被修改也不会导致签名失效。

例如:ZIP 元数据。同时,v1 方案对 APK 内部被保护的原始文件,是单独进行计算数据摘要的,所以在验证时,需要先解压再验证,导致安装时会花费更多的时间,消耗更多的内存。例如 v1 方案中签渠道的方式就是利用了此特性,将渠道信息写入 META-INF 文件中,这不会破坏 v1 签名。

APK 签名:v1 v2 v3 v4

为了解决这些问题,Android 7.0 中引入了 APK 签名方案 v2。

缺点

  • 不安全
  • 速度慢

APK 签名方案 v2

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

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

APK 签名:v1 v2 v3 v4

上图是签名前后,APK 文件结构的对比。可以看到在 v2 已签名的 APK 中,包含了 4 个部分:

  1. ZIP 条目的内容
  2. APK 签名分块(APK Signing Block)
  1. ZIP 中央目录
  2. ZIP 中央目录结尾

在验证期间,v2+ 方案会将 APK 文件视为 blob,并对整个文件进行签名检查。对 APK 进行的任何修改(包括对 ZIP 元数据进行的修改)都会使 APK 签名作废。这种形式的 APK 验证不仅速度要快得多,而且能够发现更多种未经授权的修改。

新的签名格式向后兼容,因此,使用这种新格式签名的 APK 可在更低版本的 Android 设备上进行安装(会直接忽略添加到 APK 的额外数据),但前提是这些 APK 还带有 v1 签名。

APK 签名:v1 v2 v3 v4

从安全的角度 v2 会比 v1 更安全,v2 签名是验证整个打包后的 APK 文件,所以对其 APK 文件做「任何」改动都会破坏签名。注意这里的任何是带引号的,Vv 签名的签名块其实是一个 K-V 的结构,可以向其中插入一些简单的数据而不破坏 v2 签名,这就是 v2 方案下,多渠道的方案思路。

缺点

  • 无法解决签名过期更换签名的问题

v3 签名

v2 方案解决了安全问题以及安装时验证的效率问题,但是它并没有解决换签名问题。

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

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

APK 签名:v1 v2 v3 v4

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

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

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

V4 签名

在传统的应用安装方案中,开发者通过 ADB(Android Debug Bridge)以有线或无线的方式与终端用户连接,或者用户从软件商店直接下载,然而该方案需要用户等待完整的安装包传输结束后才能启动安装,在这期间产生了不良的用户体验。

增量安装技术是一种流式的安装方案:一旦安装包的核心文件传输完成便可启动应用。流式安装意味着允许优先传输核心数据以启动应用,并在后台流式传输剩余数据

在Android 11中,Google在内核中实现了增量文件系统用于对增量安装的支持。(详见https://source.android.com/devices/architecture/kernel/incfs

这使得 Android os 可以通过 ADB 流式传输 APK。同时,Android 11 为了适应增量安装,添加了新的 v4签名方案。

此方案不改变前代签名方案而是创建一种新的签名:基于 APK 所有字节数据计算出 Merkle 哈希树,并将Merkle 树的根哈希、盐值作为签名数据进行包完整性验证。新的签名数据保存在 .idsig 文件中并且在进行增量安装前必须为APK创建对应的 v4 签名文件。

官方文档:v4签名

总结

  • v1 签名实际上就是 JAR 签名的方案,它不会保护 APK 内的所有问题,存在安全和效率问题

  • v2 签名是一种全文件签名方案,增加了 APK 签名块(APK Signing Block),但仍无法解决更换签名的问题

  • v3 签名是 v2 的升级版,也被称为 v2+。在 V2 插入的签名块(Apk Signature Block V2)中,又添加了一个新快(Attr 块),它使用链表存储了所有的签名信息,验证时就像 CA 证书的证明过程。

  • v4 签名是为了 增量安装 技术而产生的一种新的签名方案。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145143.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 1077. 皇宫看守(树形dp)[通俗易懂]

    1077. 皇宫看守(树形dp)[通俗易懂]太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫。皇宫各个宫殿的分布,呈一棵树的形状,宫殿可视为树中结点,两个宫殿之间如果存在道路直接相连,则该道路视为树中的一条边。已知,在一个宫殿镇守的守卫不仅能够观察到本宫殿的状况,还能观察到与该宫殿直接存在道路相连的其他宫殿的状况。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少。

    2022年8月9日
    9
  • java工具类——验证码(VerifyCode)[通俗易懂]

    java工具类——验证码(VerifyCode)[通俗易懂]importjava.awt.BasicStroke;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics2D;importjava.awt.image.BufferedImage;importjava.io.FileNotFoundException;importjava.io.IOExcept

    2022年7月15日
    18
  • 全012路规律_11选5判断012路的方法

    全012路规律_11选5判断012路的方法堆题目链接将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:x is the root:x是根结点;x and y are siblings:x和y是兄弟结点;x is the parent of y:x是y的父结点;x is a child of y:x是y的一个子结点。输入格式:每组测试第1行包含2个正整数N(≤ 1000)和M(≤ 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的N个要被

    2022年8月8日
    8
  • 大数据建设背景介绍

    大数据建设背景介绍随着移动互联网、物联网和云计算技术的迅速发展,开启了移动云时代的序幕,大数据(BigData)也越来越吸引人们的视线。正如1982年世界预测大师、未来学家约翰.奈斯比特(John.Naisbitt)在他的著作中所提到的:“我们现在大量生产信息,正如过去我们大量生产汽车一样”、“人类正被信息淹没,却饥渴知识”,等等诸的预言均在当下得到了充分的证实,这也恰恰说明,世界正处一个信息爆照的时代。Internet的出现缩短了人与人、人与世界之间的距离,整个世界连成一个“地球村”,人们通过网络无障碍交流交换信息和

    2022年5月30日
    48
  • 解决ORA-01008: 并非所有变量都已绑定(详解问题所在)

    解决ORA-01008: 并非所有变量都已绑定(详解问题所在)将executeUpdate(sql)或executeQuery(sql)括号中的sql删除。问题代码:publicstaticvoidmain(String[]args)throwsException{Connectionconnection=null;Statementstatement=null;connection=DBHelper.getConnection();Stringsql=”up

    2025年9月28日
    3
  • CRC校验算法[通俗易懂]

    CRC(CyclicRedundancyCheck):循环冗余检验。在链路层被广泛使用的检错技术。CRC原理:1、发送端1.1、在发送端先将数据分组,每组k个数据。假定要传送的数据是M。1.2、在数据M后面添加供差错检测的n位冗余码,然后构成一帧发送出去,一共发送(k+n)位。虽然添加n位冗余码增大了数据传送的开销,但是可以进行差错检测,当传输可能出现差错时,付出这种代价是值

    2022年4月18日
    79

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号