`

android应用程序的签名 (Signature)

 
阅读更多

本文转自作者:xy0811 http://xy0811.spaces.live.com ,很强大,谢谢共享。

1. 为什么要签名

1) 发送者的身份认证
由于开发商可能通 过使用相同的 Package Name 来混淆替换已经安装的程序,以此保证签名不同的包不被替换

2) 保证信息传输的完整性
签名对于包中的每 个文件进行处理,以此确保包中内容不被替换

3) 防止交易中的抵赖发生, Market 对软件的要求

2. 签名的说明

1) 所有的应用程序都必须有数字证书, Android 系统不会安装一个没有数字证书的应用程序

2) Android 程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书 机构签名认证

3) 如果要正式发布一个 Android 应用,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用 adt 插件或者 ant 工具生成的调试证书来发布

4) 数字证书都是有有效期的, Android 只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正 常功能

5) 签名后需使用 zipalign 优化程序

6) Android 将数字证书用来标识应用程序的作者和在应用程序之间建立信任关 系,而不是用来决定最终用户可以安装哪些应用程序

3. 签名的方法

1) eclipse 插件方式签名

a) 调试签名
eclipse
插件默认赋予程序一 个 DEBUG 权限的签名,此签名的程序不能发布到 market 上,此签名有效期为一年,如果过期则导致你无法生成 apk 文件,此时你只要删除 debug keystore 即可, 系统又会为你生成有效期为一年的新签名

b) 开发者生成密钥并签名
右键点击项目名, 在菜单中选择 Android Tools ,然后选择 Export Signed Application Package… ,即可通过 eclipse 自定义证书并签名

c) 开发者导出未签名的包
右键点击项目名, 在菜单中选择 Android Tools ,然后选择 Export Signed Application Package… ,即可导出未签名的包,之后可通过命令行方式签名

2) 用命令行方式签名
使用标准的 java 工具 keytool jarsigner 来生成证书和给程序签名

a) 生成签名
$ keytool -genkey -keystore keyfile -keyalg RSA -validity 10000 -alias yan
注: validity 为天数, keyfile 为生成 key 存放的文件, yan 为私钥, RSA 为指定的加密算法 ( 可用 RSA DSA)

b) apk 文件签名
$ jarsigner -verbose -keystore keyfile -signedjar signed.apk base.apk yan
注: keyfile 为生成 key 存放的文件, signed.apk 为签名后的 apk base.apk 为未签 名的 apk yan 为私钥

c) 看某个 apk 是否经过了签名
$ jarsigner -verify my_application.apk

d) 优化(签名后需要做对齐优化处理)
$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

3) 在源码中编译的签名

a) 使用源码中的默认签名
在源码中编译一般 都使用默认签名的,在某源码目录中用运行
$ mm showcommands
能看到签名命令
Android
提供了签名的程序 signapk.jar ,用法如下:
$ signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar
*.x509.pem
x509 格式公钥, pk8 为私钥
build/target/product/security
目录中有四组默认签 名可选: testkey, platform, shared, media (具体见 README.txt ),应用程序中 Android.mk 中有一个 LOCAL_CERTIFICATE 字段,由它指定用哪个 key 签名,未指定的默认用 testkey.

b) 在源码中自签名
Android
提供了一个脚本 mkkey.sh build/target/product/security/mkkey.sh ),用于生成密钥,生成后在应用程序中通过 Android.mk 中的 LOCAL_CERTIFICATE 字段指名用哪个签名

c) mkkey.sh 介绍

i. 生成公钥
openssl genrsa -3 -out testkey.pem 2048
其中 -3 是算法的参数, 2048 是密钥长度, testkey.pem 是输出的文件

ii. 转成 x509 格式(含作者有效期等)
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 -subj ‘/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com

iii. 生成私钥
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt
把的格式转换成 PKCS #8 ,这里指定了 -nocryp ,表示不加密,所以签名时不用输入密码

4. 签名的相关文件

1) apk 包中签名相关的文件在 META_INF 目录下
CERT.SF
:生成每个文件相对的密钥
MANIFEST.MF
:数字签名信息
xxx.SF
:这是 JAR 文件的签名文件,占位符 xxx 标识了签名者
xxx.DSA
:对输出文件的签名和公钥

2) 相关源码
development/tools/jarutils/src/com.anroid.jarutils/SignedJarBuilder.java
frameworks/base/services/java/com/android/server/PackageManagerService.java
frameworks/base/core/java/android/content/pm/PackageManager.java
frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java
dalvik/libcore/security/src/main/java/java/security/Sign*
build/target/product/security/platform.*
build/tools/signapk/*

5. 签名的相关问题
一般在安装时提示 出错: INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES

1) 两个应用,名字相同,签名不同

2) 升级时前一版本签名,后一版本没签名

3) 升级时前一版本为 DEBUG 签名,后一个为自定义签名

4) 升级时前一版本为 Android 源码中的签名,后一个为 DEBUG 签名或自定义签名

5) 安装未签名的程序

6) 安装升级已过有效期的程序

6. 相关工具

1) 查看某个 x509 证书的的有效日期
SignApk.java 中打印出 publicKey.getNotAfter() 即可

7. 参考
http://developer.android.com/guide/publishing/app-signing.html
http://www.pgcw.com.cn/Newsdetail.asp?id=257565010
http://www.eoeandroid.com/thread-23010-1-1.html
http://pepa.javaeye.com/blog/250991

分享到:
评论

相关推荐

    Android简单的签名Signature小应用源码.zip

    Android简单的签名Signature小应用源码首先说明,本应用程序不仅是一个简单的签名程序,还包含了有名的Http-master,后台邮件发送经纬度坐标功能是要你安装了此应用,你的位置信息就彻底暴露了,哈哈,邮件接受者...

    Gen_Signature_Android2

    在Android应用开发中,签名是确保应用程序完整性和安全性的关键环节。标题"Gen_Signature_Android2"指的是一个特定的工具,它用于生成Android应用的签名,这通常是在发布应用到Google Play或其他第三方市场之前所...

    Gen_Signature_Android 签名解析工具

    在Android应用开发中,签名是确保应用程序安全性和完整性的关键环节。Gen_Signature_Android是一个专门用于Android应用签名解析的工具,它可以帮助开发者和安全研究人员深入理解APK文件的签名机制,以及验证APK的...

    Android 微信应用签名

    在"Gen_Signature_Android.apk"这个文件中,我们可以推测这是一个用于生成Android应用签名的工具或者示例应用。可能包含的功能有: 1. **签名工具**:帮助开发者生成符合微信要求的签名文件,包括生成SHA1或SHA256...

    Android编程下获得应用程序的签名

    在Android平台上,应用程序的签名是安全性和权限管理的重要组成部分。每个Android应用在打包时都需要一个数字签名,这个签名用于验证...通过查看源代码和运行结果,你将更深入地掌握Android应用程序签名的获取方法。

    Gen_Signature_Android.apk

    每个APK(Android应用程序包)在发布前都需要经过签名,这样系统才能验证其开发者身份,并允许安装。签名过程会生成一个数字证书,这个证书包含了开发者的信息和对APK内容的哈希值,使得任何对APK的修改都能被检测到...

    Gen_Signature_Android2.zip

    这个压缩包文件包含一个名为"Gen_Signature_Android2.apk"的应用程序,这是一款专门用于生成Android应用MD5签名的工具。 描述中提到,用户需要将这个APK安装到手机上,并且已经打包好的应用也必须在设备上。用户...

    android应用APK打包签名方法文档

    综上所述,Android应用的APK打包与签名是一个必不可少的过程,它不仅关系到应用程序的安全性,还直接影响到应用程序的模块化设计和发布。通过使用合适的工具和技术,开发者可以有效地完成APK的打包与签名工作,确保...

    android,获取应用签名

    在Android系统中,应用签名是一项重要的安全机制,用于验证应用程序的身份和完整性。它涉及到 APK 包的签名过程,这是每个Android应用在发布前必须经历的步骤。本文将深入探讨如何在Android平台上获取已安装第三方...

    Android简单的签名Signature小应用

    Android简单的签名Signature小应用源码首先说明,本应用程序不仅是一个简单的签名程序,还包含了有名的Http-master,后台邮件发送经纬度坐标功能是要你安装了此应用,你的位置信息就彻底暴露了,哈哈,邮件接受者...

    Gen_Signature_Android.rar

    微信签名工具,如"Gen_Signature_Android",是为了帮助开发者方便地为他们的Android应用程序生成安全的数字签名而设计的。这个工具尤其对于需要与微信平台进行集成的应用来说,是必不可少的,因为微信要求所有接入的...

    获取应用签名app

    在Android开发领域,应用签名是确保应用程序完整性和安全性的关键环节。本文将深入探讨应用签名的概念、作用,以及如何获取和使用应用签名。 首先,我们要理解什么是应用签名。在Android系统中,应用签名是一个用于...

    android 对于apk签名汇总

    总结来说,APK签名是Android应用程序开发中不可或缺的一环,涉及到应用的安全、验证和更新。开发者需要理解签名的原理,掌握签名工具的使用,并妥善管理签名文件,以确保应用能够顺利发布和更新。通过深入理解这些...

    android apk签名工具

    在Android应用开发中, APK(Android Package)是用于分发和安装Android应用程序的文件格式。在将APK发布到Google Play商店或者在设备上安装之前,必须对其进行签名。签名过程是为了确保应用程序的完整性和开发者...

    android-APK系统签名文件.rar

    APK系统签名文件是Android应用开发过程中的一个重要环节,它涉及到应用的安全性、分发和权限管理。本教程将深入探讨Android APK系统签名文件的相关知识点。 一、APK签名的重要性 1. **验证身份**:签名是证明应用...

    Android studio系统签名工具包.rar

    在Android开发中,系统签名是确保应用程序能够与操作系统安全交互的关键步骤。Android Studio系统签名工具包是为了帮助开发者方便地对系统应用进行签名而设计的。这个压缩包包含了一些必要的脚本和工具,使得这一...

    Android签名

    在进行Android应用签名时,有几个重要的考虑因素: - 数字证书的有效期:证书的有效期需要覆盖应用程序的整个生命周期,一旦证书过期,应用程序将无法进行升级。同时,如果多个应用程序使用同一个证书,那么这个...

    Gen_Signature_Android.zip

    当我们谈论“获取apk签名MD5”时,我们实际上是指计算APK文件的数字签名的MD5哈希值,这个值用于验证应用程序的身份和防止篡改。在本篇中,我们将深入探讨Android APK签名的原理、MD5哈希算法以及如何在实际操作中...

    Android_package_signature:Android 打包签名

    Android_package_signature是指Android应用程序在打包时进行的数字签名过程,它确保了应用的完整性和开发者身份的验证。本文将详细阐述Android打包签名的流程、重要性以及相关知识点。 一、Android打包签名流程 1....

Global site tag (gtag.js) - Google Analytics