安卓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 ...
随机推荐
- 《大型网站系统与JAVA中间件实践》读书笔记-消息中间件
消息中间件 1.消息中间件的价值 1.1 透过示例看消息中间件对应用的解耦 1.1.1.通过服务调用让其他系统感知事件发生的方式 假设我们要做一个用户登录系统,其中需要支持的一个功能是,用户登录成功 ...
- mysql简单的增删改查
增加 MYSQL>insert into class (stu,name,age) values (1,'zhangsan',23);(回车) 另外,如果输入的是中文的话,在windows下可能 ...
- 更新CentOS 6.7源为阿里源
1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...
- 发现project项目打红色感叹号的一种解决方案
在window-preferences中的xml catalog中对打叉的dtd进行remove. 很有可能是包导错了,打开config build path然后将打红叉的文件进行remove.
- MongoDB在linux下的启动
最近公司数据库用到MongoDB,而之前只关注知道它是分布式非关系数据库,数据以文档的形式存储,数据格式是类似json的bson格式.而对于具体用法以及java如何调用并没有过多接触,今天花费一天的时 ...
- python 爬虫004-使用urllib2与正则表达式扒取糗事百科新鲜页首页帖子
面向过程的方式 #!/usr/bin/env python # -*- coding: utf-8 -*- import urllib2 import sys import re import os ...
- easyui-textbox高为0
之前在项目中也遇到过,一段时间没遇到这种问题居然又忘记了,想着还是在博客中记录一下,方便自己记忆,也供大家参考. 大家是否也遇到过easyui-textbox高为0的情况呢 像这样: 用户名:< ...
- 51nod 1486
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 1486 大大走格子 题目来源: CodeForces 基准时间限 ...
- 【Java】方法的重载与重写
一.方法的重载 1.概念 方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数. 调用重载方法时,Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方 ...
- a, b交换与比较问题
1. 求a, b中较大的数,不使用if.?.switch等判断语句. 答案: 另一种思路是求两者的差,然后通过位运算判断差值的正负,不过个人觉得还是第一种各位简洁优雅. 2. 交换a, b的值,要求不 ...