安卓数字签名指的是对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包重复签名问题的更多相关文章

  1. 查看APK包名签名等信息

    有些游戏第三方比如分享需要配置游戏包名和签名,不同渠道包名签名又不同,所以时常需要查看不同apk包等签名信息,之前是使用等微博开放平台的手机客户端查看apk签名,前提是知道包名,网上找了下查看签名和包 ...

  2. 搭建ionic3-angular5 开发环境并打包成安卓apk包教程

    安装node.js 搭建ionic3-angular5 开发环境,首先查看本地电脑是否安装node环境,打开终端,输入 命令: node -v 没有去安装nodejs  网址:http://nodej ...

  3. 批量修改安卓apk包名

    1.准备工作 1.1 反编译工具apktool下载 1.2 java, android SDK安装 1.2 python安装 2.反编译现有包 apktool.bat d test.apk 3. 直接 ...

  4. Eclipse发布安卓APK包无图标的解决方法

    算是一个Bug,清空项目都不行. 解决方法是卸载掉项目,重新导入.

  5. php获取apk包信息的方法

    /*解析安卓apk包中的压缩XML文件,还原和读取XML内容 依赖功能:需要PHP的ZIP包函数支持.*/ include('./Apkparser.php'); $appObj = new Apkp ...

  6. 【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用

    一个android apk的编译过程 请参考: http://www.2cto.com/kf/201312/261475.html 典型的编译过程: aapt( Android Asset Packa ...

  7. IONIC 打包安卓apk详细过程

    参照以下链接: https://blog.csdn.net/qq_20264891/article/details/79319408 当 cordova 项目安装的 android 平台版本 与 系统 ...

  8. mac下自己实现re-sign.jar对apk进行重签名

    利用Robotinum对给的apk文件进行自动化测试,在不知道源码的情况下,只有apk文件如何进行自动化测试呢? 首先需要对apk文件进行重签名,并获得该apk文件的包名和程序入口的类名. 最开始网上 ...

  9. 使用Gradle打出带签名的apk包

    step1:配置build.gradle文件 step1:切换到项目所在目录,用build命令打包 首先 gradle clean 命令清理一下当前项目 E:\AndroidStudioProject ...

随机推荐

  1. js异步获取数据的问题

    最近做js开发的时候发现了很多哥们不能区分同步和异步的区别,典型的在ajax部分,在该ajax为异步操作的时候,获取不到success之后的data的值,于是产生了各种奇葩的写法.比如创建一个局部变量 ...

  2. java 枚举类型 enum

    在java SE5中添加了枚举类型,即enum关键字.在这之前,当你需要创建一个整形常量集时,但是这些枚举值并不会必然的将其自身的取值限制在这个常量集的范围之内,因此这样做的显得不安全,也不方便使用. ...

  3. Android开发-Android Studio安装

    开发平台:Windows 7 旗舰版,SP1 开发工具:Android Studio1.2正式版 1.打开http://www.androiddevtools.cn/ ,找到Android Studi ...

  4. 画龙点睛 之RabbitMQ 初来乍到

    消息队列解决了什么问题 1. 异步处理 2. 应用解耦 3. 流量削峰 4. 日志处理...... 安装RabbitMQ (这里的安装我只仅仅说一下linux 的安装 如果想安装windows 版 可 ...

  5. Mongodb笔记(三)user && aggregate && mapReduce

    版本:mongodb3.4. User: mongodb使用验证登录:默认不开启,mongod中使用--auth开启:  mongod -port=3000 --auth  : 基本方法: db.cr ...

  6. linux安装----gcc

    Linux中gcc是个编译工具,可以将源码文件(c c++ java文件) 编译成 二进制文件.

  7. UWP

     东哥对UWP有兴趣么 Shine 2016/4/23 13:37:23 最近好像是重大更新 Shine 2016/4/23 13:37:27 https://blogs.msdn.microsoft ...

  8. Selenium学习笔记(1) - 自动化测试体系与原理

    技术体系 基于代码的测试(Code-Based Testing) 基于协议的测试(Protocol-Based Testing) 基于界面的测试(GUI-Based Testing) 工作原理 基于代 ...

  9. Ceph Monitor的数据管理

    转自:https://www.ustack.com/blog/ceph-monitor-2/ Monitor管理了Ceph的状态信息,维护着Ceph中各个成员的关系,这些信息都是存放在leveldb中 ...

  10. python----模块知识拓展

    1.hashlib ------configpraser-------- xml hashlib 模块导入:import hashlib 模块说明:用于将信息加密,明文变成密文 功能说明 MD5算法 ...