一 Android签名机制及原理

Android系统在安装APK的时候,首先会检验APK的签名,如果发现签名文件不存在或者校验签名失败,则会拒绝安装,所以应用程序在发布之前一定要进行签名。给APK签名可以带来以下好处:

应用程序升级

如果想无缝升级一个应用,Android系统要求应用程序的新版本与老版本具有相同的签名与包名。若包名相同而签名不同,系统会拒绝安装新版应用。

应用程序模块化

Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序。此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块。

代码或数据共享

Android提供了基于签名的权限机制,一个应用程序可以为另一个以相同证书签名的应用程序公开自己的功能与数据,同时其它具有不同签名的应用程序不可访问相应的功能与数据。

应用程序的可认定性。

签名信息中包含有开发者信息,在一定程度上可以防止应用被伪造。例如网易云加密对Android APK加壳保护中使用的“校验签名(防二次打包)”功能就是利用了这一点。

签名原理

对一个APK文件签名之后,APK文件根目录下会增加META-INF目录,该目录下增加三个文件:

MANIFEST.MF
NETEASE.RSA
NETEASE.SF

其中.RSA文件还可能是.DSA文件,RSA与SF文件的文件名可以更改,但是它们的命名必须一样。

MANIFEST.MF中保存了APK里所有文件的SHA1校验值的BASE64编码,格式如下(一个文件对应一条记录):

Name: res/anim/abc_fade_in.xml
SHA1-Digest: ohPEA4mboaFUu9LZMUwk7FmjbPI=
Name: res/anim/abc_fade_out.xml
SHA1-Digest: MTJWZc22b5LNeBboqBhxcQh5xHQ=

SF文件里保存了MANIFEST.MF文件的SHA1校验值的BASE64编码,同时还保存了MANIFEST.MF中每一条记录的SHA1检验值BASE64编码,格式如下:

SHA1-Digest-Manifest: ZRhh1HuaoEKMn6o21W1as0sMlaU=
Name: res/anim/abc_fade_in.xml
SHA1-Digest: wE1QEZhFkLBWMw4TRtxPdsiMRtA=
Name: res/anim/abc_fade_out.xml
SHA1-Digest: MfCV1efdxSKtesRMF81I08Zyvvo=

RSA文件则包含了签名的公钥、签名所有者等信息,还保存了http://my.oschina.net/u/816213/blog/685762?fromerr=RSS3IhKo用SHA1withRSA签名算法对SF文件的签名结果信息。

Android系统就是根据这三个文件的内容对APK文件进行签名检验的。

二 Android 签名方法

1、apksign、jarsinger

一般的签名过程可以由apksign.jar或者jarsinger.jar完成。apksign.jar由Android SDK提供,使用方法如下:

java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk

它接受一个PEM公钥文件,PK8私钥文件,对update.apk进行签名,签名后的文件保存到update_signed.apk。

jarsinger是由JDK提供,使用方法如下:

jarsigner -verbose -keystore d:\\debug.keystore -signedjar update_signed.apk update.apk androiddebugkey -digestalg SHA1 -sigalg MD5withRSA -keypass android -storepass android

其中:

-keystore表示keystore文件的路径

androiddebugkey 表示keystore中的一个别名

-digestalg表示摘要算法

-sigalg 表示签名算法

-keypass 表示别名密码

-storepass表示keystore密码

经过测试,发现以上两个传统的签名工具存在以下缺点:

1)、jarsigner在对一个已经有META-INF目录的APK进行签名的时候,有可能会报错:

jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry compressed size (expected 1368 but got 1379 bytes)

2)、如果APK中已经有签名文件且签名文件中的RSA(或DSA)、SF文件的命名不是CERT的时候,用这两个签名工具进行签名后,会出现:

META-INF目录下会有两个RSA/SF文件,会导致APK在安装的时候失败。

3)、签名花费时间长。这两个签名工具在生成签名后的APK时,是按Zip中一个entry接一个entry 依次拷贝的,效率十分低。因为游戏类型APK类文件数量一般比较多,所以这一缺陷在签名游戏类型APK时,体现得尤为明显。

2、极速签名工具(ApkSinger)

极速签名工具克服了signapk.jar与jarsigner在签名过程的缺点,使用方法:

java -jar ApkSigner.jar [-appname test] -keystore keystorePath -alias alias [-pswd password] [-aliaspswd aliasPassword] apkPath(or directory)

-appname 待签名的应用程序名,可选,但建议不同的APP填上对应的app名

-keystore 后跟.keystore签名文件

-alias 后跟签名别名

-pswd 后跟对应签名的密码,可选,如果不填,则签名的时候需要手动输入

-aliaspswd  对应别名alias的密码,如果没有则默认使用keystore Password

最后跟待签名的APK路径或者目录路径 ,如果跟的是目录则是批量签名.

Android APK签名原理及方法相关推荐

  1. android软件更新模块实现的技术和方法,Android APK签名原理及方法

    一 Android签名机制及原理 Android系统在安装APK的时候,首先会检验APK的签名,如果发现签名文件不存在或者校验签名失败,则会拒绝安装,所以应用程序在发布之前一定要进行签名.给APK签名 ...

  2. Android APK签名原理

    Android APK 签名原理涉及到密码学的加密算法.数字签名.数字证书等基础知识,这里做个总结记录. 非对称加密 需要两个密钥,一个是公开密钥,另一个是私有密钥:一个用作加密的时候,另一个则用作解 ...

  3. Android apk签名获取方法

    Android apk签名获取的一种方法,供大家参考 Windows(黑窗口)或Mac(终端)获取apk的签名: 1,先获取.jks文件路径(复制好备用) 2,在黑窗口或终端中输入 keytool - ...

  4. Android APK 签名比对

    Android APK 签名比对 转载请注明出处:http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html Android APK  ...

  5. Android APK签名 JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore E:\xxxxxx- pkcs12“ 迁移到行业标准格式

    Android Studio中进行签名 转载地址:Android APK签名 JKS 密钥库使用专用格式.建议使用 "keytool -importkeystore -srckeystore ...

  6. unity3d android包太大了,unity/unity3d编译成android apk包瘦身方法

     unity/unity3d编译成android apk包瘦身方法 本文系原创,请转发的朋友带上我的链接. 相信用unity开发的同学都会遇到类似的经历:明明资源图片不大,但是发现打包后apk文件 ...

  7. Android apk签名方法

    为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动 ...

  8. Android apk签名方法介绍

    还望支持个人博客站:http://www.enjoytoday.cn 参考博客:http://www.enjoytoday.cn/posts/203 为什么要签名 在介绍签名方法之前,首先我们来了解下 ...

  9. android apk 签名方法,[转载]Android apk签名的两种方法

    为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动 ...

最新文章

  1. MVC系列1-MVC基础
  2. redis cluster集群选主
  3. ZedGraph在Asp.net中的应用
  4. 前端学习(1737):前端调试值测试窗口的切换
  5. 在 React 工程中利用 Mota 编写面向对象的业务模型
  6. pcl里面的RoPs特征(Rotational Projection Statistics)
  7. 在线涂鸦画板小程序源码
  8. 中国联通加快数据中心建设:全网机架数量超过32万架
  9. 内核页表隔离(Kernel page-table isolation,KPTI,简称PTI,旧称KAISER)
  10. 分布式系统原理_终于有架构大牛把分布式系统概念讲明白了,竟然用了足足800页...
  11. 地理信息考c语言,南师地理信息系统专业01方向真题C语言
  12. 学习一些和redux一样作用的mobx知识
  13. html css 博客园,分享几个博客园代码样式的CSS配置(复制黏贴即可)
  14. webpack项目篇(六十六):react 全家桶 和 webpack 开发 h5 商城项目的整体思路
  15. labview温度采集系统,温度计正负范围内显示,附加温度预警操作部分(初学者~)
  16. 代码编辑器CodeMirror及其简单的配置
  17. react-ssr之路由配置
  18. 河南省第十届ACM程序设计大赛参赛心得
  19. Spring Cloud限流详解
  20. 高科技玩具这么无趣,为何还要鼓励孩子玩?

热门文章

  1. hsf端口_hsf配置
  2. 摆脱运营打杂,进阶高级运营!运营小咖秀特训营第3期圆满落幕
  3. 报错解决:Process finished with exit code -1073741819 (0xC0000005)
  4. git的一些详细命令
  5. vue uniapp 实现走马灯 ,文字横向滚动
  6. db2import详解_DB2 import 与 load的区别
  7. call、apply、bind函数详解
  8. python内存管理
  9. 2019中兴迪杰斯特拉比赛回顾与分析
  10. C语言单链表实现初始化、创建、增、删、查等基本操作(详细)