安卓数字签名指的是对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. [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    题目描述 Every year in Wisconsin the cows celebrate the USA autumn holiday of Halloween by dressing up i ...

  2. OCR训练数据生成方法

    有的时候我们训练网络的时候,数据集在收集的过程中由于种种原因导致图像收集的不完整,比如某些种类很少,或者没有,这个时候我们就可以考虑自己生成数据集. 这个和data augmentation还不太一样 ...

  3. Hibernate -- 一对多的双向关联关系

    示例代码: Customer.java package cn.itcast.many2onedouble; import java.util.HashSet; import java.util.Set ...

  4. bzoj 2190: [SDOI2008]仪仗队 线性欧拉函数

    2190: [SDOI2008]仪仗队 Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 作为 ...

  5. ASCII_01

    1.来自“http://baike.baidu.com/link?url=WgFPtGe-rT6x6X0r_OiHGVZAV87Fu4_P5fvr7FsGyrm8QqTGuvVUfg4Jx7Rn-Le ...

  6. ionic2常见问题——修改应用图标及添加启动画面(官方命令行工具自动生成)

    1.项目根目录->resources 分别存放应用图标及添加启动画面,替换成自己的图案既可. 2.这样在命令行中重新运行ionic resources ,就能看到应用图标和名字已经被替换了: 3 ...

  7. Ubuntu下Python使用MySQLdb远程连接数据库的常见问题及解决方案

    本文基于http://www.cnblogs.com/fnng/p/3565912.html这篇博文,学习使用MySQLdb过程中遇到下面这些问题. 1. 安装MySQLdb时运行sudo pytho ...

  8. DOM解析XML文件例子

    DOM解析XML文件是一次性将目标文件中的所有节点都读入,然后再进行后续操作的方式. 一般分为以下几步: 1. 定义好目标XML文件路径path . 2. 实例化DOM解析工厂对象 ,Document ...

  9. VS2010 将程序发布至网站时,发生错误“未能给 bin/Debug/publish//setup.exe 签名“

    VS2010 将程序发布至网站时,发生错误“未能给 bin/Debug/publish//setup.exe 签名“  错误:   因为某项目未能生成,所以无法发布. ---------------- ...

  10. form表单的提交地址一定要是完整的绝对地址

    <form action="<%=path%>/servlet/DologinServlet" =<form action="<%=requ ...