Android数字签名的创建
Android的数字签名是保证在同一个Android系统中,相同包名不同签名的apk无法覆盖安装。
这么做的目的,是为了证明开发者的身份和防止抵赖。
假设有用户先装了一个正版App,而后下载了一个相同包名的盗版App,如果可以覆盖安装,则不能使用户得知这是个盗版(或者说与原来App不同)的App。
还有就是这个App若有什么后门病毒之类的,持有数字签名的人就无法抵赖。
创建Android数字签名的方式如下:
(1)在项目上右键,选择Android Tools-->Export Signed Application Package
(2)自动填入工程名,不允许修改和含有中文,需要修改的地方在上一步操作前先修改
(3)输入第一重密码,若之前有了,最好拿之前的,这里我新建了一个,新建时要指定签名文件的导出位置
(4)输入信息(别名,第二重密码等)第二重密码最好与第一重不相同
有效期选项,谷歌官方建议是到2033年以后,但少于亦可
(5)设置导出APK的位置
(6)至此,大功告成。下面测试下,拿导出的签名后的APK和bin目录里的APK做个实验
这个是拿bin目录中的APK文件安装到模拟器
直接安装,告诉我们系统中已经存在这个apk了
重新安装,显示成功。
(7)使用导出的已签名的APK
直接安装,还是显示已经存在
从新安装,显示解析失败,证书矛盾
这样就验证了之前提到的数字签名的作用了。
以下内容摘自 http://www.cnblogs.com/feisky/archive/2010/01/17/1650076.html
在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应用程序才能取得该权限。Android使用Java的数字证书相关的机制来给apk加盖数字证书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机制。Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。这个数字证书并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。
同一个开发者的多个程序尽可能使用同一个数字证书,这可以带来以下好处。
(1)有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名。
(Roadley:这点至关重要)
(2)有利于程序的模块化设计和开发。Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。
(3)可以通过权限(permission)的方式在多个程序间共享数据和代码。Android提供了基于数字证书的权限赋予机制,应用程序可以和其他的程序共享概功能或者数据给那那些与自己拥有相同数字证书的程序。如果某个权限(permission)的protectionLevel是signature,则这个权限就只能授予那些跟该权限所在的包拥有同一个数字证书的程序。
在签名时,需要考虑数字证书的有效期:
(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。
(2)如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序的预计生命周期。
(3)Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后。
(Roadley:应该是google play上面的应用程序需要又掀起到2033年以后,导出签名包时并无限制,只有警告)
Android数字证书包含以下几个要点:
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(Roadley:我们平时编程时可以直接运行在模拟器上是因为eclipse会自动帮我们签名)
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
(Roadley:eclipse生成的私钥并不是固定的,所以使用它来签名并不保险)
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
(5)Android使用标准的java工具 Keytool and Jarsigner 来生成数字证书,并给应用程序包签名。
(6)使用zipalign优化程序。