apk去除签名验证工具安卓版_App 签名过期或泄露怎么办?别担心,Google 已经给出解决方案!...

fe80ef2a7579c25d5055dfae7cb8ec3f.png

58218c34065523307cc19565adbbadd4.png

一、序

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

签名的作用,除了证明 App 的所有权之外,还可以帮助 Android 市场和设备校验 APK 的正确性。

Android 的签名是自证明的,并不会对证书进行 CA 认证。也就是我们可以使用工具自行生成签名证书,只要是一个格式正确的签名,系统就会承认,并且允许安装。

生成签名的时,可以指定一个有效时间,这个时间默认为 25 年,并且 Google Play 也有硬性规定,上架的 App 签名有效期必须在 2033-10-22 日期之后。所以只要不是手欠修改了这个有效期,在当下这个时刻,是不会有问题,毕竟到现在还没有一款 App 存在 25 年。

有些问题不在眼前,却是真实存在的。对于一款上架的 App,最重要的就是用户,而当签名失效之后,我们只能被迫替换签名,此时因为签名校验无法通过,就会导致旧用户无法覆盖安装。这些历史用户唯一的选择,就是卸载后重新安装。

好在这不仅仅是你我的问题,天塌下来有个子高的顶着,所以别担心,Google 已经着手在解决这个问题了。

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

二、新的签名方案 V3

2.1 Android 的签名方案

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

  • V1 方案:基于 JAR 签名。

  • V2 方案:APK 签名方案 V2,在 Android 7.0 引入。

  • V3 方案:APK 签名方案 V3,在 Android 9.0 引入。

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

因为这种签名方案的升级,本身就是向下兼容的,所以只要使用得当,这个过程对开发者是透明的。

V1 到 V2 方案的升级,对开发者影响最大的,就是渠道签署的问题。在当下这个大环境下,我们想让不同渠道、市场的安装包有所区别,携带渠道的唯一标识,这就是我们俗称的渠道包。

好在各大厂都开源了自己的签渠道方案,例如:Walle(美团)、VasDolly(腾讯)都是非常优秀的方案,想了解的可以先看看之前的文章:《Android 签名和多渠道打包原理》。

2.2 签名的历史

先从 Android 签名的历史讲起。

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

ff0becbe19bfa2e8abaa2cdd7e11e24f.png

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

c98f3820543f53f93649885fd5cd7550.png

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

在 V1 签名方案中,并不会保护 APK 内的所有文件,会存在一些例外部分,即便被修改也不会导致签名失效,例如:ZIP 元数据。同时,V1 方案对 APK 内部被保护的原始文件,是单独进行计算数据摘要的,所以在验证时,需要先解压再验证,导致安装时会花费更多的时间,消耗更多的内存。

例如 V1 方案中签渠道的方式就是利用了此特性,将渠道信息写入 META-INF 文件中,这不会破坏 V1 签名。

26ceec28773879ace0913a3e1611f51c.png

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

df1d42de20a78bff0025f48af194f49d.png

在这个额外的签名块(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 文件中,更改签名。

b4e610901da4341d2ce0c6528a3f61dd.png

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

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

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

2.4 V3 签名的验证过程

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

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

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

c820eb88e1a86ed32ff5f6a3dd13e7a2.png

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

三、总结时刻

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:https://www.guardsquare.com/en/blog/android-apk-signature-scheme-v3-context-and-new-opportunities

https://source.android.com/security/apksigning

https://xuanxuanblingbling.github.io/ctf/android/2018/12/30/signature/


「联机圆桌」?推荐我的知识星球,一年 50 个优质问题,上桌联机学习。

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

99fb16b10f9dd2bc55ef441f6e389c20.png

b8b0d628467f1d6fd9901399afa6b8fd.png

bd13b6a4add09b8c07de43831c2e8ed8.png

dfd69697a58e6e7e2da7c6f71a5d63b3.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初入WEBOTS半个月来的一点总结

对于我这一个从十一假期结束后才刚刚接触webots的小白来说,webots简直就是一个噩梦。在这里记录一下噩梦的发展历程。 在最初安装webots时就遇到了麻烦。安装7.0.3总是出问题。程序找不到接入点。替换dll文件也没有用更新运行库也不行。最好索性重新买固态硬盘做了个…

skype 回放设备出现问题

最近用skype拨打电话换台电脑会出现“回放设备出现问题”,拨通号码后会自动跳掉无法拨通 一直更新声音驱动器,结果发现跟声卡驱动半毛钱关系都没有,是要插入耳麦。

sonar java_修复Sonar中常见的Java安全代码冲突

sonar java本文旨在向您展示如何快速修复最常见的Java安全代码冲突。 它假定您熟悉代码规则和违规的概念以及Sonar如何对其进行报告。 但是,如果您以前从未听过这些术语,则可以阅读Sonar Concepts或即将出版的有关Sonar的书 ,以获取更详细的解…

linux服务器性能查看

################### cpu性能查看 ############################################################1、查看物理cpu个数:cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l2、查看每个物理cpu中的core个数:cat /proc/cpuinfo |grep "…

android sdk 安装_Appium+python自动化1-环境安装(上)

前言appium可以说是做app自动化测试最火的一个框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python。小编擅长Python,所以接下来的教程是appiumpython的实例。学习appium最大的难处在于环境的安装,80%的人死于…

Mean

题目描述 NiroBC 是猫咪学堂一年级的新生,开学第一天,学堂组织了一场迎新会,在 迎新会上,猫咪们会互相赠送礼物。 一年级的新生共有 N 只猫咪,编号为 1 . . . N(包括 NiroBC 自己),其…

如何开启mysql计划事件

首先在sql中查询计划事件的状态:SHOW VARIABLES LIKE event_scheduler如果返回的是off表示当前是关闭状态,如果是on当前已经开启了计划任务。在mysql程序的目录下找到my.ini文件,添加一个项:event_scheduler 1保存后重启mysql服务…

在Java等于方法中进行精确比较

多年来,我一直在处理旧版Java代码,因此遇到了微妙的逻辑和性能问题,这些问题可以追溯到不正确覆盖的Object.equals(Object)方法。 尽管“等于”方法背后的概念看似简单,但Josh Bloch在《 有效Java》中指出&…

python爬虫网络出错怎么办_Python爬虫常见问题

第一个问题:JS加密如何突破 (1) 熟练掌握Chrome的开发者工具的各个功能,Elements, Network,Source (2) 认真观察,善于思考。Network查看加载流程,找可疑的xhr请求,设置xhr断点,通过C…

Linux Top 命令解析 比较详细

TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。 TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监…

用webstorm在chrome 调试页面时一直弹出 copy authorization url to clipboard

用chrome来调试页面,每次刷新会弹出 requested without authorization, 是因为更新后的bug,可以在Setting - debugger中设置 转载于:https://www.cnblogs.com/dxxzst/p/WebStorm.html

2003 cant connect to MySQL server on 'XXX.XXX.XXX.XXX'

数据库在配置正常并且也配置了mysql 在局域网上互相访问的用户和ip但是会出现2003 cant connect to MySQL server on XXX.XXX.XXX.XXX ,本地机子连接一切正常但是局域网其他机器就是无法连接。通过检测发现是电脑的防火墙问题,关闭防火墙后电脑上的数据库就可以被局…

C++插入中文到mysql乱码

C 插入中文字符到mysql数据库出现乱码,奇怪的是直接在数据库写查询语句直接进行插入,是不会出现乱码 然后就根据一些材料把数据库,得编码形式改为gb2312但是结果仍然乱码中(设置my.ini中的字符集)。 猜想 有可能是C和…

mountain_OS X Mountain Lion上的多个Java版本

mountain在Mountain Lion之前,Java被捆绑在OS X中。似乎在升级期间,我在计算机上安装的Java 6版本被删除了。 显然,在升级过程中卸载Java的原因是Java运行时存在的安全问题。通过这种方式,您不得不安装可解决此安全问题的最新版本…

python手机自动化测试脚本语言_Python+Appium实现APP自动化测试

一、环境准备 1.脚本语言:Python3.x IDE:安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境,path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows,官网地址 http://appium.io/ ​ 点击下载按钮会到GitHu…

Win7无线网络和有线网络网络负载选择

最近在看如何让有线网络和无线网络实现对接。win7网络可以同时连接两个网卡无线和有线,在同时间上连接两个网络用 的是哪个网络,用是哪个流量(可以用currPorts软件来查看电脑用是哪个网络的流量),哪个网络是闲置网络。 同时可以…

怎么查看linux服务器有cpu

cat /proc/cpuinfo中的信息processor 逻辑处理器的id。physical id 物理封装的处理器的id。core id 每个核心的id。cpu cores 位于相同物理封装的处理器中的内核数量。siblings 位于相同物理封装的处理器中的逻辑处理器的数量。1 查看物理CPU的个数#cat /proc/cpuinfo |grep &q…

python条件输出_python基础(二)条件判断、循环、格式化输出

继续上一篇,今天主要总结一下条件判断、循环、格式化输出 一.条件判断 python中条件判断使用if else来判断,多分支的话使用if elif ... else,也就是如果怎么怎么样就怎么怎么样,否则就怎么怎么这样,格式如下: score i…

拼图项目的诅咒:为什么Java 9一遍又一遍地延迟?

JDK 9发行日期推迟到2017年7月 距JDK 9发行不到200天,它又被推迟了 。 新的发布日期已更新为2017年7月,比之前推迟的日期晚了四个月。 推迟日期 9月13日,Oracle Java平台小组的首席架构师Mark Reinhold发表了他的建议,推迟了JDK…

linux下安装maven

1、下载maven安装包 wget http://219.238.7.73/files/211300000CAE3924/mirrors.hust.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz 2、解压缩maven tar -zxvf apache-maven-3.5.4-bin.tar.gz 3、在/etc/profile文件中配置maven环境变量 #maven …