APK签名机制之——V2签名机制详解

APK签名机制之——V2签名机制详解,第1张

通过前一篇 Apk签名机制之——JAR签名机制详解 的分析我们知道,JAR签名需要对apk内所有文件进行hash校验,当资源较多时签名验证速度较慢。为了加快验证速度并加强完整性保证,Andorid在70引入一种全文件签名方案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 70中引入的,为了使APK可在Android 70以下版本中安装,应先用JAR签名对APK进行签名,再用V2方案进行签名。要注意顺序一定是先JAR签名再V2签名,因为JAR签名需要修改zip 数据区 和 中央目录 的内容,先使用V2签名再JAR签名会破坏V2签名的完整性。

实际上我们在编译APK时并不需要关心这个过程,在Android Plugin for Gradle 22中,gradle默认会同时使用JAR签名和V2方案对APK进行签名,如果想要关闭JAR签名或V2签名,可以在buildgradle中进行配置:

在 Android 70 中,会优先以 v2方案验证 APK,在Android 70以下版本中,系统会忽略 v2 签名,仅验证 v1 签名。Android 70+的校验过程如下:

因为在经过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签名机制都有了大致的了解,有兴趣的同学可以阅读签名和校验的源码进一步分析。


可以直接在小米盒子里面下载百度网盘就行。

三种安装方案:1、自带应用市场下载。2、三方应用市场下载。3、通过U盘拷贝下载安装

百度网盘TV版详细安装步骤+其他事项:

1、 可以通过智能电视&盒子&投影仪的应用市场安装下载,以小米电视&盒子为例

1) 打开小米电视或小米盒子,在『我的』界面找到『我的应用』

2) 点击『搜索应用』,搜索『BDWP』,点击图标并按引导安装完成

2、 可以通过当贝市场、沙发管家等第三方电视应用市场安装下载,以当贝市场为例

1) 打开电视,在『我的应用』里找到『当贝市场』,打开应用

2) 在当贝市场搜索『BDWP』,点击图标并按引导安装完成

3、 如果电视应用市场找不到百度网盘,则可以通过U盘安装,需要有电脑和U盘

1) 打开电脑,百度搜索『百度网盘』,找到『客户端下载』

2) 选择『TV』,点击『下载TV版』,将下载的文件复制到U盘中,注意不要更改文件后缀名称,确保文件后缀为apk

3) 将U盘插入电视或者投影仪USB接口,根据提示打开U盘,进行安装

4、 详细分电视品牌的安装引导可以查看:>

5、 注意现在百度网盘TV版只支持电视 *** 作系统为安卓44以上版本,低于44版本暂不支持

有花生壳,或者其他的端口转发,用自己的电脑做服务器,通过代理,比如说你的Tomcat端口8080,代理是一个软件绑定端口,会给到你一个网址,你通过网址就能访问你的后台了。相当于就是把127001:8080,替换成网址,随便哪个上网设备都能够访问到。

1、打debug包时计算机会默认生成一个签名自动绑定debug包,所以debug包不可以再加手动签名,会导致冲突。
2、打release包时需要手动创建签名文件,随后将release包与签名绑定,如不绑定,安装时会提示没有安全证书,无法安装apk包。

手机上要安装google框架,即google服务包(包括google地图 play商店 chrome等等),如果没有请各位自行百度如何刷google框架或服务包,这里我就不再专门写教程了(貌似刷机精灵,酷市场这些软件也是可以直接安装的)。
3、安装522版本以后的COC安卓版(据说521会有google+绑定的问题)
以上准备工作完成后正式开搞!
一、Google+绑定
1、点开COC页面右下角齿轮按键,没有绑定状态下的COC页面上G+的图标通常显示为红色,点击图标登录,如果登录不成功请继续看步骤2,登录成功的话会显示绿色,就可以跳过去直接看关联其他设备的教程了。
部落冲突换手机怎么办 COC账号绑定教程
2、退出游戏,打开手机上的“Play商店”应用,并使用自己的google账户登录(登录和注册教程我就不啰嗦了)
部落冲突换手机怎么办 COC账号绑定教程
3、下载并安装SmartHosts(这是神马自由门知道吗!**知道吗!这是钥匙),运行应用给予root权限,然后点击第一个选项,点击保存,应用会自动替换你的hosts文件,提示成功后重启手机。需要的我会在附件放出APK。
部落冲突换手机怎么办 COC账号绑定教程
4、再次开启游戏,运行步骤1,这次G+图标应该顺利变绿了吧。
部落冲突换手机怎么办 COC账号绑定教程
二、将你的COC账号备份或关联多个设备。
希望可以帮到你


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13360476.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-21
下一篇 2023-07-21

发表评论

登录后才能评论

评论列表(0条)

保存