关于APK签名的一些东西
什么是APK
了解APK签名之前,首先要知道什么是apk文件:APK是AndroidPackage的缩写,即Android安装包(apk),APK文件其实就是zip格式的文件,只是后缀被改为了apk,所以用任何能解压zip的软件都可以直接把一个APK文件解压出来,解压出来的东西如图(已签名的APK):


APK签名
APK签名的意义
- 安全,每个发布的Android应用在升级的时候都需要保证签名和包名必须相同,这样如果有人使用了不一致的签名或篡改了我们的发布的apk包,系统将拒绝进行升级
- 权限管理,Android提供了基于签名的权限机制,一个应用程序可以为另一个以相同证书签名的应用程序公开自己的功能,从而实现应用程序间以安全的方式共享代码和数据,具体可以参看<Permission>标签
- 模块化,Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块
APK签名的原理
目录结构
从我们解压出来的APK目录里面可以看到有一个META-INF目录,里面保存的三个文件就是我们签名过程中生成的东西,就是这仨货:

- MANIFEST.MF:所有文件的摘要信息,但不包括它们仨自己
- CERT.SF:保存的是MANIFEST.MF的摘要值,以及MANIFEST.MF中每一个摘要项的摘要值
- CERT.RSA:保存的是利用密钥对CERT.SF进行加密生成的数字签名和签名时用到的数字证书,数字证书保存的就是公钥和签名算法
签名过程
对APK签名的过程可以简单归结如下:首先利用SHA-1摘要生成算法对我们所有的文件生成摘要信息,然后利用密钥对我们的摘要信息进行加密数字签名,最后把未加密的摘要信息、数字签名和签名所用的数字证书(公钥、加密算法、发布者等)一起发布出来,生成最后的签名APK文件,整个过程如图所示:

相关概念
签名的过程涉及到了很多摘要算法、数字签名等概念,下面先对它们一一进行说明,熟悉的同学可以略过
消息摘要
维基百科:http://en.wikipedia.org/wiki/Message_digest
简单的说消息摘要就是在消息数据上,执行一个单向的Hash函数,生成一个固定长度的Hash值,这个Hash值即是消息摘要也称为数字指纹:
消息摘要有以下特点:
1. 通过摘要无法推算得出消息本身
2. 如果修改了消息,那么摘要一定会变化(实际上,由于长明文生成短摘要的Hash必然会产生碰撞),所以这句话并不准确,我们可以改为:很难找到一种模式,修改了消息,而它的摘要不会变化
数字签名
数字签名就是信息的发送者用自己的私钥对消息摘要加密产生一个字符串,加密算法确保别人无法伪造生成这段字符串,这段数字串也是对信息的发送者发送信息真实性的一个有效证明
数字证书
数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件,最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名,此外,数字证书只在特定的时间段内有效;
注意,APK签名时用到的数字证书是用户自己在本地生成的,并不需要权威机构的发布或认证,是一个自签名的数字证书
APK签名的方法
对APK包签名的步骤无非就是产生key和签名两步,签名的方法主要有三种:
- JDK:JDK中有keytool和jarsigner两个工具,keytool用于产生加密用的key,jarsigner用于对APK进行签名,这两个文件都可以在JAVA的bin目录下找到,操作的方法当然是命令行了

- signapk:signapk是Android提供的签名工具,可以在build后的Android源码中找到也可以直接到网上去下,命令行:signapk [-w] publickey.x509[.pem] privatekey.pk8 input.jar soutput.jar publickey.x509.pem里包含的是证书和证书链,证书和证书链中包含了公钥和加密算法;privatekey.pk8是私钥;input.jar是需要签名的jar;output.jar是签名结果
- IDE:平常大家打包的方式基本都是IDE帮我们做了,无论是Eclipse还是Intellij Idea(Android Studio),都可以创建自己新的keystore或使用已有的keystore,但无论哪种都需要牢记自己的keystore password和key password,这个就是只属于你自己的密钥了;这两个IDE的操作基本是一样的,略有不同的是Eclipse是在导出项目(Export Project)的时候来做这个事情,而Intellij Idea(Android Studio)是在菜单栏-->build-->Generate Signed APK,而且Intellij Idea(Android Studio)在导出前可能会让你输入一个MASTER KEY,这里随便输一个密码就可以,但是要记住这个密码
这里贴一个Eclispe的操作方法:http://mamicode.com/info-detail-11527.html,网上讲得很清楚了,不在此赘述
其他相关参考资料
Android APK签名对比及说明:http://www.cnblogs.com/qq78292959/archive/2011/07/25/2116113.html
Android APK签名过程分析:http://blog.csdn.net/asmcvc/article/details/9311827
Android APK破解:http://www.cnblogs.com/qq78292959/archive/2011/07/25/2116127.html
关于APK签名的一些东西的更多相关文章
- Android5.1.1 - APK签名校验分析和修改源码绕过签名校验
Android5.1.1 - APK签名校验分析和修改源码绕过签名校验 作者:寻禹@阿里聚安全 APK签名校验分析 找到PackageParser类,该类在文件“frameworks/base/cor ...
- eclipse将android项目生成apk并且给apk签名
转载:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作 ...
- Android APK 签名 (转发)
Cordova 3.5 为 Android APK 签名,生成可发布的 APK 程序文件 任侠 2014-06-07 00:04 移动开发 抢沙发 16,288 views 目录 [隐藏] ...
- 一次简单的绕过apk签名校验
朋友发来一个apk,需要分析其中的一些算法,分析过程涉及到了重新打包apk,打包后的apk运行失败,估计是apk内部有检验是否被篡改的代码.检验apk是否被篡改,简单的方法是直接校验签名,如果apk签 ...
- apk签名(不打包)
apk提交给应用市场加固后,需要重新签名 签名工具:360签名 下载地址:http://yunpan.cn/cm8GqVWL7Y8Eh 签名步骤:http://jiagu.360.cn/qcms/he ...
- 获取APK签名
获取apk签名工具类 import android.content.Context; import android.content.pm.PackageInfo; import android.con ...
- Shell脚本查看apk签名信息
用shell写了一个查看apk签名的脚本.代码很少也很简单 支持递归目录查询 #!/bin/bash #使用方法 ./getcertificate.sh xx.apk get_signature() ...
- 为App签名(为apk签名)
为App签名(为apk签名) 原文地址 这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商 ...
- Android开发中Ant命令编译和APK签名的一些心得
本文章麦子学院跟小伙伴们详细的分享一下关于Android Ant命令行编译和APK签名详解一些实现方法,这是一个朋友在自己做安卓开发时写的,希望对大家会有所帮助呀. 最近在做Android开发时,需要 ...
随机推荐
- JavaScript字符串的操作-课堂笔记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- server与Portal联合,portal许可过期无法登录。
server与Portal联合,portal许可过期无法登录,怎样解除联合. 解决方案由峥姐友情提供~~ (1)删除有两种方式(①/②选其一即可): ①类似 链接ttps://sunl.esrichi ...
- Thinkphp查询 1.查询方式 2.表达式查询 3.快捷查询 4.区间查询 5.组合查询 6.统计查询 7.动态查询 8.SQL 查询
1.使用字符串作为条件查询 $user = M('User'); var_dump($user->where('id=1 AND user="蜡笔小新"')->sele ...
- SEO实战宝典阅读笔记
1. 对搜索引擎更友好 1.1 sitemap sitemap自动生成 https://www.xml-sitemaps.com 谷歌 sitemap.xml 百度 sitemap.html 1.2 ...
- mysql关于排序值的问题
- jquery 给指定li添加制定的css样式
$("ul li").eq(1).css({"color":"red"}); //第二个li $("ul li").eq ...
- Golang Import使用入门
我们在写Go代码的时候经常用到import这个命令用来导入包文件,而我们经常看到的方式参考如下: import( "fmt" ) 然后我们代码里面可以通过如下的方式调用 fmt.P ...
- C#面试(2016年4月)
1.WebForm和MVC的区别 MVC: 1)通过model.view.controller将处理后台逻辑代码与前台展示逻辑代码进行了很好的分离: 2)通过修改路由规则,可以控制生成自定义的url, ...
- Programming pearls 编程珠玑的题目
Programming pearls 编程珠玑的题目 这段时间有空都在看编程珠玑,很经典的一本书,一边看一边用 python 做上面的题目,我做的都放到 github 上了 https://githu ...
- Oracle之nclob类型
此类型会严重影响查询效率,请少用: nclob字段在查询结果中显示为<NCLOB>,查看nclob类型的值方法有两种 a.可点开...查看具体数据 b.选择所有数据,右击复制到Excel, ...