安卓apk包重复签名问题
安卓数字签名指的是对apk包做文件摘要并加密,在安装apk包时做解密和验证以保证包体不被篡改。这里先普及下签名和验证流程。签名文件保存在apk包里META-INF目录下,包含3个文件:
1、后缀为MF的是摘要文件。首先遍历apk包,将除META-INF目录外其他所有文件用SHA1生成摘要信息并用base64编码。如果你手动改变了apk包中的文件,那么在apk包安装验证时,改后的文件摘要信息与原MF文件中的不一致,会导致安装失败。
2、后缀为SF还是摘要文件。对上面生成的MF文件做两步处理,首先读取全量摘要文件使用SHA1生成摘要并用base64编码,然后再次读取各文件子项再次做一样的摘要操作。
3、后缀为RSA的是签名文件。数字证书一般存放在钥匙库中,从数字证书中取出私钥,对SF文件使用SHA1-RSA算法进行非对称加密得到RSA文件。在安装时从钥匙库取出数字证书的公钥并解密,再与未加密前的摘要信息进行对比,相符则说明apk包未被篡改。
问题场景是原来签名正常的apk包突然出现闪退现象。经定位发现该签名包体原来已经签过名,重复签名导致问题发生。排查代码发现,在生成MF文件时调用addDigestsToMainfest方法时没有去掉以上三个文件,导致重复签名时重复计算摘要,安装验证时拿计算后的摘要比较计算前的,必然会出现验证失败。
举例,首次签名时包里是不存在这三个文件的,所以首次签名会正常生成wlf. MF、wlf.SF和wlf.RSA;第二次签名会把这三个文件也计算进wlf.MF里去,接着按上面逻辑生成另外两个文件,再替换掉原来三个同名文件。而且这时wlf.MF已经改变了,同样其他两个文件也跟着变。那么在验证时拿新的摘要去比对包体里老的摘要,发现这三个文件被替换了,验证也就失败了。第三次重复签名的话这三个文件还会被替换成新的,因为计算后文件又被替换了,以此类推。举个例子,好比你拿着刚办好的二代身份证给人家看,但人家系统里只有你的一代身份证,虽然名字一样,样貌衣着却变了,人家一核对就怀疑你了。而篡改的人就是你自己,这就叫监守自盗了。所以做摘要必须要去掉那三个文件。
安卓apk包重复签名问题的更多相关文章
- 查看APK包名签名等信息
有些游戏第三方比如分享需要配置游戏包名和签名,不同渠道包名签名又不同,所以时常需要查看不同apk包等签名信息,之前是使用等微博开放平台的手机客户端查看apk签名,前提是知道包名,网上找了下查看签名和包 ...
- 搭建ionic3-angular5 开发环境并打包成安卓apk包教程
安装node.js 搭建ionic3-angular5 开发环境,首先查看本地电脑是否安装node环境,打开终端,输入 命令: node -v 没有去安装nodejs 网址:http://nodej ...
- 批量修改安卓apk包名
1.准备工作 1.1 反编译工具apktool下载 1.2 java, android SDK安装 1.2 python安装 2.反编译现有包 apktool.bat d test.apk 3. 直接 ...
- Eclipse发布安卓APK包无图标的解决方法
算是一个Bug,清空项目都不行. 解决方法是卸载掉项目,重新导入.
- php获取apk包信息的方法
/*解析安卓apk包中的压缩XML文件,还原和读取XML内容 依赖功能:需要PHP的ZIP包函数支持.*/ include('./Apkparser.php'); $appObj = new Apkp ...
- 【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用
一个android apk的编译过程 请参考: http://www.2cto.com/kf/201312/261475.html 典型的编译过程: aapt( Android Asset Packa ...
- IONIC 打包安卓apk详细过程
参照以下链接: https://blog.csdn.net/qq_20264891/article/details/79319408 当 cordova 项目安装的 android 平台版本 与 系统 ...
- mac下自己实现re-sign.jar对apk进行重签名
利用Robotinum对给的apk文件进行自动化测试,在不知道源码的情况下,只有apk文件如何进行自动化测试呢? 首先需要对apk文件进行重签名,并获得该apk文件的包名和程序入口的类名. 最开始网上 ...
- 使用Gradle打出带签名的apk包
step1:配置build.gradle文件 step1:切换到项目所在目录,用build命令打包 首先 gradle clean 命令清理一下当前项目 E:\AndroidStudioProject ...
随机推荐
- HDU 5704
题意:n个人参加一个游戏,每个人选择0-100范围的数.m为选择的所有数的平均数*2/3,选择的数<=m且距离m最近的人获胜,若同时有多人满足条件则随机抽取胜者.如果一个人选的数,比m小,且相距 ...
- codeforces 703B
题意:有n座城市,其中k座是省会城市,每个城市有对应的点权,城市1-2-3-...-n-1有一条路相连,省会城市与其他所有的城市相连,且每两个城市间最多有一条路,每条路的边权为路连接的两座城市的点权乘 ...
- spark集群安装
cd到conf中去 修改名字 mv spark-env.sh.template spark-env.sh 并且修改内容 添加: export JAVA_HOME=/root/java/jdk1.8 ...
- mysql-8.0.11-winx64.zip安装教程
mysql-8.0.11-winx64.zip安装教程 下载zip安装包: MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/download ...
- gulp前端构建工具的搭建
我的机器: 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux 1 ...
- AIDL与Binder的区别
Binder是一个远程对象的基础类,核心部分是远程调用机制,这部分是由IBinder定义的. 它是对IBinder类的实现,其中IBinder类提供了这样一个类的标准的本地化实现方式. 大多数开发者不 ...
- JMS-activMq与spring进行整合
对JMS做了一个简要介绍之后,接下来就讲一下Spring整合JMS的具体过程.JMS只是一个标准,真正在使用它的时候我们需要有它的具体实现,这里我们就使用Apache的activeMQ来作为它的实现 ...
- python time 和 datetime 模块的简介
时间处理 time 和 datetime import timeimport datetimeprint time.time() #时间戳显示为1508228106.49print time.strf ...
- python3 on macos with vscode
brew install python3 python3 -m pip install pylint python3 -m pip install autopep8 python3 -m pip in ...
- HDU 1561 The more, The Better(树形DP+01背包)
The more, The Better Time Limit : 6000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other ...