Android程序要运行就必须要签名,在发布一款Android app之前,需要使用/jdk/bin目录下的keytool和jarsigner两个工具来完成签名任务。其中,keytool用来生成证书(keystore),jarsigner用来进行签名。
APK签名原理
1、要点:
a.所有的应用程序都必须有数字证书 ,Android系统不会安装一个没有数字证书的应用程序;
b.Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证;
c.数字证书都是存在有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
d.Android使用标准的java工具 Keytool 、Jarsigner 来生成数字证书,并给应用程序包签名。
2、作用
b、应用程序模块化:Android 系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块。
a、Android系统签名主要有ROM签名和应用程序APK签名两种形式。ROM签名是针对已经生成的Android系统ROM包进行签名。应用程序APK签名是针对开发者开发的应用程序APK进行签名。
b、APK实际上是一个jar或者说是一个zip压缩文件,META-INF目录下存放的是压缩包中所有文件的签名信息,用来保证apk包的完整性和系统的安全。
c、重签名:实际上就是删除META-INF目录(删除已有签名),使用自已数据证书再次重签名。
APK重签名示例
1、生成本机keystore数字证书
keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000
命令说明:
此时会在C盘根目录下生成一个debug.keystore证书文件。
2、删除原有的APK签名文件,具体操作如下:
a. 将app-debug.apk重命名为app-debug.zip,并解压
b. 并将文件夹app-debug重命名为app-debug_temp
c. 进入app-debug_temp,找到META-INF并删除
d. 将app-debug_temp整个文件夹重新打包成.zip压缩包,然后更改扩展名为.apk
3、APK重签名
jarsigner -verbose -keystore debug.keystore -storepass Android -keypass Android -signedjar app-debug_signed.apk app-debug_temp.apk androiddebugkey
命令说明:
##
jarsigner是Java的签名工具
-verbose参数表示:显示出签名详细信息
-keystore表示使用当前目录中的debug.keystore签名证书文件。
-storepass 密钥口令
-signedjar ThinkDrive_signed.apk表示签名后生成的APK名称,
ThinkDrive_temp.apk 表示未签名的APK,
androiddebugkey表示debug.keystore的别名
##
此时,C盘根目录下会生成经过重签名后的一个新的.apk文件app-debug_signed.apk。
在手机上安装经过重签名的安装包,提示“解析软件包时出现问题”,安装失败,该apk文件采用了签名保护机制,阻止程序运行,从而保证应用不被恶意修改后重新发布。
一般的,对于apk文件的签名测试,如果存在这样的预期结果,即:更换签名后,触发应用防御机制,应用无法启动或提示“解析软件包时出现问题”,那么可以说明应用具备签名保护机制。