什么是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文件,整个过程如图所示:

Android系统在验证的时候会根据数字证书提供的公钥和解密算法进行解密,然后拿解密出来的摘要信息(hash序列)与手机本地文件生成的摘要信息进行比对,如果之前APK被篡改或所用签名与发布时不一致,就会导致解密出来的摘要信息与本地不一致,从而达到验证的目的.
对三个文件生成的过程及源码分析,有兴趣的同学可以参考这个:http://blog.csdn.net/kickxxx/article/details/18252881

相关概念

签名的过程涉及到了很多摘要算法、数字签名等概念,下面先对它们一一进行说明,熟悉的同学可以略过

消息摘要

维基百科:http://en.wikipedia.org/wiki/Message_digest

百度百科:http://baike.baidu.com/link?url=W926rkCvewjKzCRSLiqIALuQv11MbL1CM1IdeS_rmAKEpyLAp1AWZMj9rLiYt7FUQ2XorChF6zhWn6REVolcmzHcBNekhkr4M-zThoeS-ertuCT92f6uTqCRUolR-jvx

简单的说消息摘要就是在消息数据上,执行一个单向的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签名的一些东西的更多相关文章

  1. Android5.1.1 - APK签名校验分析和修改源码绕过签名校验

    Android5.1.1 - APK签名校验分析和修改源码绕过签名校验 作者:寻禹@阿里聚安全 APK签名校验分析 找到PackageParser类,该类在文件“frameworks/base/cor ...

  2. eclipse将android项目生成apk并且给apk签名

    转载:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作 ...

  3. Android APK 签名 (转发)

    Cordova 3.5 为 Android APK 签名,生成可发布的 APK 程序文件  任侠  2014-06-07 00:04  移动开发  抢沙发  16,288 views  目录 [隐藏] ...

  4. 一次简单的绕过apk签名校验

    朋友发来一个apk,需要分析其中的一些算法,分析过程涉及到了重新打包apk,打包后的apk运行失败,估计是apk内部有检验是否被篡改的代码.检验apk是否被篡改,简单的方法是直接校验签名,如果apk签 ...

  5. apk签名(不打包)

    apk提交给应用市场加固后,需要重新签名 签名工具:360签名 下载地址:http://yunpan.cn/cm8GqVWL7Y8Eh 签名步骤:http://jiagu.360.cn/qcms/he ...

  6. 获取APK签名

    获取apk签名工具类 import android.content.Context; import android.content.pm.PackageInfo; import android.con ...

  7. Shell脚本查看apk签名信息

    用shell写了一个查看apk签名的脚本.代码很少也很简单 支持递归目录查询 #!/bin/bash #使用方法 ./getcertificate.sh xx.apk get_signature() ...

  8. 为App签名(为apk签名)

    为App签名(为apk签名) 原文地址 这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商 ...

  9. Android开发中Ant命令编译和APK签名的一些心得

    本文章麦子学院跟小伙伴们详细的分享一下关于Android Ant命令行编译和APK签名详解一些实现方法,这是一个朋友在自己做安卓开发时写的,希望对大家会有所帮助呀. 最近在做Android开发时,需要 ...

随机推荐

  1. IOS网络第二天 - 06-POST请求

    ************POST请求 #import "HMViewController.h" #import "MBProgressHUD+MJ.h" @in ...

  2. python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)

    1.#面向对象 #抽象接口 === 抽象类 #就是架构师给你一个架子,你们去写,如果满足不了直接报错 #python2 print("python2---抽象类".center(2 ...

  3. opencv支持的机器学习算法

    CXCORE库: Mahalanobis距离: K均值: CV库: 人脸检测/Haar分类器 ML库: 正态朴素贝叶斯分类器: 决策树: Boosting: 随机森林: EM算法: K近邻(KNN): ...

  4. Python中的对象类型的初步介绍

    一:介绍 1.为什么使用内置对象 对象类型是语言的一个部分 内置对象构成了每个python程序的核心部分 2.核心数据类型 数字 字符串 列表 字典 元组 文件 集合 其他类型 编程单元类型 与实现相 ...

  5. Yii2 关闭和打开csrf 验证 防止表单多次重复提交

    原文地址:http://blog.csdn.net/terry_water/article/details/52221007 1.在Yii2配置中配置所有:所有的controller都将关闭csrf验 ...

  6. 远程连接服务器for Linux

    远程连接Linux云服务器-命令行模式 1.远程连接工具.目前Linux远程连接工具有很多种,您可以选择顺手的工具使用.下面使用的是名为Putty的Linux远程连接工具.该工具是免费的,且不需要安装 ...

  7. CentOS7.2 创建本地YUM源和局域网YUM源

    1背景 由于开发环境只有局域网,没法使用网上的各种YUM源,来回拷贝rpm包安装麻烦,还得解决依赖问题. 想着搭建个本地/局域网YUM源,方便自己跟同事安装软件. 2环境 [root@min-base ...

  8. Java语言程序设计(基础篇) 第六章 方法

    第六章 方法 6.2 定义方法 1.方法的定义由方法名称.参数.返回值类型以及方法体组成. 2.定义在方法头中的变量称为形式参数(formal parameter)或者简称为形参(parameter) ...

  9. Linux 利用进程打开的文件描述符(/proc)恢复被误删文件

    Linux 利用进程打开的文件描述符(/proc)恢复被误删文件 在 windows 上删除文件时,如果文件还在使用中,会提示一个错误:但是在 linux 上删除文件时,无论文件是否在使用中,甚至是还 ...

  10. python成长之路-----day1----笔记(1)

    1.python语言介绍 python的创始人:Guido Van Rossum 2.python是一门什么样的语言 编程语言主要从以下几个角度进行分类:编译型,静态型,动态性,强类型定义语言和弱类型 ...