关闭apk签名验证(APK签名机制之——V2签名机制详解)

本文目录
APK签名机制之——V2签名机制详解
通过前一篇 Apk签名机制之——JAR签名机制详解 的分析我们知道,JAR签名需要对apk内所有文件进行hash校验,当资源较多时签名验证速度较慢。为了加快验证速度并加强完整性保证,Andorid在7.0引入一种全文件签名方案V2。下面来看V2方案的具体设计原理。
在了解V2签名结构前,先来了解下 zip(apk)文件的结构 。
zip文件分为3部分:
通过中央目录起始偏移量和size即可定位到中央目录,再遍历中央目录条目,根据本地文件头的起始偏移量即可在数据区中找到相应的压缩数据。
在 Apk签名机制之——JAR签名机制详解 中我们已经知道,JAR签名是在apk文件中添加META-INF目录,即需要修改 数据区 、 中央目录 ,因为添加文件后会导致中央目录大小和偏移量发生变化,还需要修改 中央目录结尾记录 。V2方案为加强数据完整性保证,不在 数据区 和 中央目录 中插入数据,选择在 数据区 和 中央目录 之间 插入一个 APK签名分块 ,从而保证了原始zip(apk)数据的完整性。具体如下所示:
v2 签名块负责保护第 1、3、4 部分的完整性,以及第 2 部分包含的 APK 签名方案 v2分块 中的 signed data 分块的完整性。
APK签名分块包含了4部分:分块长度、ID-VALUE序列、分块长度、固定magic值。其中 APK 签名方案 v2分块 存放在ID为0x7109871a的键值对中。在进行签名校验时,先找到zip 中央目录结尾记录 ,从该记录中找到 中央目录起始偏移量 ,再通过magic值即可确定前方可能是 APK签名分块 ,再通过前后两个分块长度字段,即可确定 APK签名分块 的位置,最后通过ID(0x7109871a)定位 APK 签名方案 v2分块 位置。
APK 签名方案 v2分块 是一个签名序列,说明可以使用多个签名者对同一个APK进行签名。每个签名信息中均包含了三个部分的内容:
前面说了v2 签名块负责保护第 1、3、4 部分的完整性,以及第 2 部分包含的 APK 签名方案 v2分块 中的 signed data 分块的完整性。第1、3、4部分的完整性是通过内容摘要来保护的,这些摘要保存在 signed data 分块中,而 signed data 分块的完整性是通过签名来保证的。下面来看摘要的计算过程:
第 1、3 和 4 部分的摘要采用以下计算方式,类似于两级 Merkle 树 。
因为V2签名机制是在Android 7.0中引入的,为了使APK可在Android 7.0以下版本中安装,应先用JAR签名对APK进行签名,再用V2方案进行签名。要注意顺序一定是先JAR签名再V2签名,因为JAR签名需要修改zip 数据区 和 中央目录 的内容,先使用V2签名再JAR签名会破坏V2签名的完整性。
实际上我们在编译APK时并不需要关心这个过程,在Android Plugin for Gradle 2.2中,gradle默认会同时使用JAR签名和V2方案对APK进行签名,如果想要关闭JAR签名或V2签名,可以在build.gradle中进行配置:
在 Android 7.0 中,会优先以 v2方案验证 APK,在Android 7.0以下版本中,系统会忽略 v2 签名,仅验证 v1 签名。Android 7.0+的校验过程如下:
因为在经过V2签名的APK中同时带有JAR签名,攻击者可能将APK的V2签名删除,使得Android系统只校验JAR签名。为防范此类攻击,V2方案规定:
攻击者还可能试图删除 APK 签名方案 v2 分块 中安全系数较高的签名,从而使系统验证安全系数较低的签名。为防范此类攻击:
通过 Apk签名机制之——JAR签名机制详解 和本篇文章的分析,我们知道了:
JAR签名的劣势
V2签名的优势
现在我们可以解答 Apk签名的基本概念和用法 前言中提出的问题了:
APK签名是为了保证APK的完整性和来源的真实性,分为JAR签名和V2签名两种方案。核心思想均是计算APK内容的hash,再使用签名算法对hash进行签名。校验时通过签名者公钥解密签名,再与校验者计算的APK内容hash进行比对,一致则校验通过。
签名证书的指纹,在申请第三方SDK时,需填入APK包名和证书指纹,SDK开发者后台会根据这两个值生成一个key。第三方SDK在初始化时,会从系统中获取当前APK的包名、签名证书指纹以及key,然后将此指纹上传到其服务器,然后校验包名、签名证书指纹是否与此key绑定,校验通过后才进行授权。
在V2方案出现之前,快速批量打包方案有3类:
在V2方案出现之后,因同时保证了 数据区 、 中央目录 和 中央目录结尾记录 的完整性,故方案2、3均不适用了。那是不是就没有快速批量打包的可能了呢?当然不是,可以从 APK签名分块 中着手。再回过头来看一下 APK签名分块 的结构:
APK签名分块 中有一个ID-VALUE序列, 签名信息( APK 签名方案 v2 分块 )只存储在ID 为 0x7109871a的ID-VALUE中,通过分析签名校验源码可以发现,其它ID-VALUE数据是未被解析的,也就是说除 APK 签名方案 v2 分块 外,其余ID-VALUE是不影响签名校验的。故可以定义一个新的ID-VALUE,将渠道信息写入 APK签名分块 中。因为V2方案只保证了第1、3、4部分和第 2 部分( APK签名分块 )包含的 APK 签名方案 v2分块 中的 signed data 分块的完整性。新写入的ID-VALUE不受保护,所以此方案可行。实际上美团新一代渠道包生成工具 Walle 就是以这个方案实现的。
好了,到这里APK签名机制的全部内部就分析完了,相信大家看完这三篇文章之后,对JAR签名和V2签名机制都有了大致的了解,有兴趣的同学可以阅读签名和校验的源码进一步分析。
华为怎么关闭签名验证
华为怎么关闭签名验证,一起来了解一下华为手机怎么关闭应用签名验证吧。
点击进入手机设置页面。
进入手机设置页面以后,会看到有多个选项,上下拖动页面,在列表中找到并点击安全选项
进入该页面后点击更多安全设置。
进入该页面后,点击安装外部来源应用,开启软件的外部来源应用安装权限。
以上就是华为手机怎么关闭软件签名验证的内容了,希望对各位有所帮助。
华为应用市场安装APP提示缺少应用签名,怎么解决
看一下,你在使用华为手机安装app的时候是否存在如下所示的情况,如果存在与页面相同的情况,那么就说明是在进行安全检测,只要不是通过怀伟应用市场下载的软件,就会提示存在风险,其实一点风险都没有。
2/6
设置方法,在手机上找到设置图标,点击该图标进如到手机设置页面。
3/6
进入手机设置页面以后,会看到有多个选项,上下拖动页面,在列表中找到并点击【安全与隐私】选项。
4/6
进入该页面以后,在页面列表中点击图示的选项。
5/6
进入该页面后,可以看到列表中的【未知来源应用下载】和【外部应用来源安装】两个选项状态都处于启动状态,为蓝色。点击图示位置的两个滑块,将这两项功能关闭。
6/6
功能关闭后显示为图示的状态,这样就设置成功了,下次在通过其他方式下载和安装app时就不再会出现步骤1中描
华为安装东西的时候会弹出签名不一致,就不让安装怎么关闭这个功能
关闭方法:
1、首先,打开手机,找到手机上面的设置选项进入。
2、然后在手机的设置里面找到安全和隐私,并点击进入。
3、进入到安全和隐私的界面,选择下方的更多的安全设置。
4、将外部来源应用下载右边的开关给打开即可。
华为设置中关闭apk安装验证
方法/步骤
1
第一步先打开手机,找到设置。
请点击输入图片描述
2
第二步,打开设置。
请点击输入图片描述
3
第三步,进入手机设置页面以后,会看到有多个选项,上下拖动页面,在列表中找到并点击【安全与隐私】选项。
请点击输入图片描述
4
第四步,进入该页面后点击更多安全设置。
请点击输入图片描述
5
第五步,进入该页面后,可以看到列表中的【未知来源应用下载】和【外部应用来源安装】,点击图示位置的两个滑块,将这两项功能关闭。
请点击输入图片描述
6
第六步,功能关闭后显示为图示的状态,这样就设置成功。
请点击输入图片描述

更多文章:
全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)
2026年9月7日 17:10
matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)
2026年9月7日 16:30
oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)
2026年9月7日 15:30
电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)
2026年9月7日 12:20
scrollthrough意思(“scroll”是什么意思)
2026年9月7日 08:00
怎么激活keygen(注册机如何激活cad2008一个简单激活cad2008的方法)
2026年9月7日 06:30




