Android独有的安全机制,除了权限机制外,另外一个就是签名机制了。签名机制主要用在以下两个主要场合起到其作用:升级App和权限检查。
1.升级App
用户在升级一款已经安装过的App时,如果程序的修改来自于同一来源,则允许升级安装,否则会提示签名不一致无法安装的提示。
2.权限检查
弯柚博客的一篇文章Android Permission权限机制的具体使用提过,对于申请权限的 protection level 为 signature 或者 signatureOrSystem 的,会检查权限申请者和权限声明者的证书是否是一致的。
至于签名机制的原理及其他作用,此不详述,本文主要介绍,签名文件key的生成、用key去签名apk文件及查看签名的方法。
3.生成keystore
创建keystore,需要用到keytool.exe (位于jdk_xx\jre\bin目录下),具体做法如下:
keytool -genkey -alias mykey -keyalg RSA -validity 40000 -keystore demo.keystore
说明:
-genkey 产生密钥
-alias mykey 别名 mykey
-keyalg RSA 使用RSA算法对签名加密
-validity 40000 有效期限4000天
-keystore demo.keystore
keytool.exe的位置:
用法示例:需要先打开命令行窗口。
最后生成的keystore文件可以在jdk_xx\jre\bin目录下,这里的目录是C:\Program Files\Java\jre7\bin
如图:
4.apk签名
4.1使用爱加密提供的APKSign.exe可视化签名工具进行加密
使用方法如下:需要准备好apk文件和上面的keystore文件。
4.2使用ADT插件方式进行签名
如果读者想在Eclipse中直接对apk文件进行签名,可以使用ADT插件附带的功能。在工程右键菜单中单击【Android Tools】>【Export Signed Application Package…】菜单项,打开【Export Android Application】对话框,并在第一页输入要导出的工程名,如图2.9所示。
进入下一个设置页后,输入密钥文件的路径(【Location】文本框)和密码,如图2.10所示。在接下来的两个设置界面中分别输入签名信息和要生成的apk文件名,如图2.11和图2.12所示。
图4.2.1 指定要导出的工程
图4.2.2 指定密钥文件的路径和密码
图4.2.3 输入签名信息
图4.2.4 输入要生成的apk文件名
在进行完上面的设置后,单击【Finish】按钮生成被签名的apk文件。查看生成的文件后会发现,除了生成ch02_showdatetime.apk文件外,还生成了一个private_keys文件。该文件就是密钥文件。下次再签名时可以直接选择该文件。
在对apk文件签完名后,可以直接将apk文件复制给要使用软件的用户或发布到Android Market以及中国移动的Mobile Market上。要注意的是,Android Market不允许上传未签名的apk文件,因此,必须对apk文件进行签名才能上传到Android Market上。
4.3使用jarsigner.exe进行签名
使用产生的keystore对apk签名,使用到的是jarsigner.exe,该工具位于jdk_xx\bin目录下,命令如下:
jarsigner -verbose -keystore demo.keystore -signedjar test_signed.apk test.apk mykey
说明:
> test_signed.apk是签名之后的文件
> test.apk是需要签名的文件
另外需要注意的是,如果你的jdk版本在1.7以上,你在对apk签名时,需要加上这个参数:
-digestalg SHA1 -sigalg MD5withRSA
否则同样会出现:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]的错误。
查看签名信息
1)查看keystore的信息
keytool -list -keystore demo.keystore -alias mykey -v
2)查看keystore的公钥证书信息
keytool -list -keystore demo.keystore -alias mykey -rfc
(注:获取Base64格式的公钥证书,RFC 1421)
3)查看apk的签名信息
jarsigner -verify -verbose -certs