一 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软件更新模块实现的技术和方法,Android APK签名原理及方法相关推荐

  1. Android APK签名原理及方法

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

  2. 面向 Android 软件开发套件(SDK)的 x86 Android* 系统映像许可协议

    英特尔公司面向 Android 软件开发套件(SDK)的 x86 Android* 系统映像的内部评估许可协议 此<内部评估许可协议>(以下简称"协议") 的订立双方为 ...

  3. Android与EPS8266模块通信(一)编写Android客户端

    Android与EPS8266模块通信(一)编写Android客户端 开发环境 Windows 10 Android Studio 2021.2.1 编写布局文件,这里需要两个按钮,一个按钮用来连接e ...

  4. Android APK签名原理

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

  5. 编写Android app更新模块遇到的问题分析与总结

    前不久接到个任务,在我们的app里面添加更新模块,在之前的版本中,我们的更新都是直接通过浏览器下载apk包来安装更新的,我想各位很大一部分应用的更新方法都是这样,因为它简单.方便,但是他也有许多不好的 ...

  6. Android app更新模块

    转自:http://blog.csdn.net/donotwarry/article/details/6931307 前不久接到个任务,在我们的app里面添加更新模块,在之前的版本中,我们的更新都是直 ...

  7. 关于Android软件更新

    2019独角兽企业重金招聘Python工程师标准>>> 关于软件更新的问题,简单的说一下. 首先软件更新需要判断是否需要更新.如果需要更新,需要获取更新的链接.我们可以把这个看成一个 ...

  8. android源码模块编译错误,【转】Android 源码编译make的错误处理--不错

    原文网址:http://blog.csdn.net/ithomer/article/details/6977386 Android编译版本:PLATFORM_VERSION=4.0.1(最新Andro ...

  9. android自动更新nitz,手机时间、夏令时及Android时间更新方式

    一.时间 时间是指世界的时间,是对某一时刻的表示.手机系统的时间,通常是在状态栏.锁屏界面等表现给用户,让用户知道现在是什么时间.时间分为标准时间和夏令时时间,标准时间是指正常的时间,夏令时是指满足特 ...

最新文章

  1. ListMapSet的操作和遍历
  2. 9-Building FIP images with support for Trusted Board Boot
  3. 找出口和BADI的ABAP程序
  4. 我发誓:下辈子再也不学JavaScript了
  5. Python入门(06) -- 正则表达式
  6. About Undefined Behavior[译文]
  7. !!!SQL sever 函数表达
  8. linux on power 开源技术的新选择
  9. 如何用html制作彩虹,使用transform和arc方法,怎么绘制彩虹效果。
  10. 信号与系统学习总结 第三章 傅里叶变换
  11. 【软考】系统集成项目管理工程师(五)项目立项管理
  12. 如何从包含代码库的.repo目录恢复出代码
  13. graphpad如何换柱状图与折线图能否混合一起_excel柱状图加折线图组合怎么做,原来是这样的...
  14. php 上传图片 裁剪,thinkphp_图片上传裁剪功能
  15. html语言的特殊符号,特殊符号
  16. AD(Altium Designer)导出BOM时出错处理
  17. 虚拟同步发电机_简报︱基于分散式微电网的虚拟同步发电机无通信预同步并网方案...
  18. 万国觉醒迁服务器显示该王国还未开放,万国觉醒的定点迁城怎么用?怎么获得定点迁城?...
  19. mysql错误#1265
  20. 在UE4中完美导入MMD的动作,表情;基本导入镜头,材质---最详细教程

热门文章

  1. 国内代码托管平台(Git)
  2. 如何更有效WEB应用防火墙确保信息安全
  3. CentOS/用FTP客户端软件连接到服务器
  4. 中文微博与社会化媒体的区域距离
  5. Linux路由器的架设
  6. 众星出席2018—2019中国文娱金数据发布盛典
  7. android interview 2
  8. iPhone开发教程之Core Data 常见问题的总结
  9. windows下安装python mysqldb
  10. IPTABLES简单应用说明和Linux下IPTABLES配置详解