应用程序签名机制实现的源代码分析
Android采用签名机制来保护应用程序的安全,以便于开发者进行身份鉴别,防止替换应用程序包和篡改内容。同时有助于在应用程序之间建立一种信任,可以由同一个私钥签名的若干个应用程序共享代码和数据。
Android系统签名主要有ROM签名和应用程序APk签名两种形式。ROM签名是针对已经生成的Android系统ROM包进行签名。应用程序APK签名是针对开发者开发的应用程序安装包APK进行签名。前者是对整个Android系统包签名,后者只对Android系统中一个应用程序APK签名。这里仅对APK签名的执行过程进行代码层面的分析,流程如图所示。

Android应用程序APK是jar包,签名采用的工具是signapk.jar包,对应用程序安装包签名的执行命令如下:
Java -jar signapk.jar publickey privatekey input.apk output.apk
此命令实现了对应用程序安装包input.apk签名的功能。在signapk.jar命令中,第一个参数为公钥publickey,第二个参数为私钥privatekey,第三个参数为输入的报名,第四个参数签名后生成的输入包名。在此命令中,signapk.jar使用公钥publickey和私钥privatekey对input.apk安装包进行签名,生成output.apk包。signapk源码位于build/tools/signapk/SignApk.java中。
完成签名后APK包中多了一个META-INF文件夹,其中有名为MANIFEST.MF、CERT.SF和CERT.RSA的三个文件。MANIFEST.MF文件中包含很多APK包信息,如manifest文件版本、签名版本、应用程序相关属性、签名相关属性等。CERT.SF是明文的签名证书,通过采用私钥进行签名得到。CERT.RST是密文的签名证书,通过公钥生成的。MANIFEST.MF、CERT.SF和CERT.RSA三个文件所使用的公钥和私钥的生成可以通过development/tools/make_key来获得。下面分被介绍MANIFEST.MF、CERT.SR和CERT.RSA三个文件生成方法。
(1)生成MANIFEST.MF文件
生成MANIFEST.MF是对APK包中所有未签名文件逐个用算法SHA1进行数字签名,再对数字签名信息采用Base64进行编码,最后将编完码的签名写MANIFEST.MFWEN文件中。添加数字签名到manifest文件通过调用addDigestsToManifest方法实现,具体代码如下:
搜索微信公众号:TestigStudio霍格沃兹的干货都很硬核