什么是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. SharePoint Configuration Wizard - Unable to upgrade SharePoint Products and Technologies because an upgrade is already in progress

    故障描述 当要运行SharePonit Products and Technologies Configuration Wizard的时候,出现了如下图所示的错误提示. 错误信息为: Unable t ...

  2. java内置数据类型

    常量在程序运行时,不会被修改的量. 在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似: finaldouble PI =3.1415927; 虽然常量名也可以用小写,但为了便于识 ...

  3. Canvas小游戏里,删除过期或者死亡元素技巧

    在许多canvas游戏,canvas效果中,经常会有过期的元素需要删除 例如现在需要制作一个笨鸟先飞(flappy bird)小游戏,游戏中障碍物(且称为柱子),此时会有一个全局变量保存所有柱子的实例 ...

  4. mysql 关联查询的执行顺序

    STRAIGHT JOIN : 能强制按照顺序关联表(应该是)

  5. 神奇的 CURL 命令

    CURL? 嗯,说来话长了~~~~ 这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑 1) 二话不说,先从这里开始吧! curl http: //www.yahoo.com   回车之 ...

  6. Codeforces554A:Kyoya and Photobooks

    A. Kyoya and Photobooks Time Limit: 2000ms Memory Limit: 262144KB 64-bit integer IO format: %I64d    ...

  7. ASP.Net一键自动化更新代码、编译、合并dll、压缩js、css、混淆dll、zip打包、发布到测试环境的bat批处理

    不废话,直接代码: D: cd D:\src\testproj\PrecompiledWeb svn revert ../ -R svn update .. rmdir BS /S /Q C:\Win ...

  8. C# 构造post参数一种看起来直观点的方法[转]

    因为本人经常爱用C#做一些爬虫类的小东西,每次构造post参数的时候,都是直接字符串拼接的方式的,有时候改起来不太方便. 场景: 需要post一个地址 参数列表 : username:管理员 pass ...

  9. 点击input时,里面默认字体消失显示

    点击input时,点击input里面默认字体消失显示: <input type="" name="" id="" value=&quo ...

  10. java 基础二 Graphics类

    一.处理图形 1.画直线 void drawLine (int startx , int starty , int endx , int endy) 参数列表:直线开始的横坐标.纵坐标,直线结束的横坐 ...