Android数字签名

转载 2012年03月21日 11:39:59

1.          为什么要签名

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

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 文件,此时你只要删除 debugkeystore 即可,系统又会为你生成有效期为一年的新签名

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

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

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

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

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

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

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

3)         在源码中编译的签名

a)          使用源码中的默认签名 
在源码中编译一般都使用默认签名的,在某源码目录中用运行 
$ mmshowcommands 
能看到签名命令 
Android 
提供了签名的程序 signapk.jar ,用法如下: 
$ signapk publickey.x509[.pem]privatekey.pk8 input.jaroutput.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.pem2048 
其中 -3 是算法的参数, 2048 是密钥长度, testkey.pem 是输出的文件

                                      ii.              转成 x509 格式(含作者有效期等) 
openssl req -new -x509 -keytestkey.pem -out testkey.x509.pem -days 10000 -subj‘/C=US/ST=California/L=MountainView/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 Studio获取数字签名(SHA1)的方法

Android Studio获取数字签名(SHA1)的方法 第一次使用,亲身经历做法 android studio 获取terminal的方法 获取SHA1方法 最近要用到地图的sdk(学生用的高德)...
  • godot06
  • godot06
  • 2016年08月12日 10:47
  • 405

Android APK的数字签名的作用和意义

1. 什么是数字签名? 数字签名就是为你的程序打上一种标记,来作为你自己的标识,当别人看到签名的时候会知道它是与你相关的 2. 为什么要数字签名? ...
  • u014649337
  • u014649337
  • 2014年09月24日 16:53
  • 1347

Android应用数字签名详解

目录目录 概述 数字签名证书生成方法 命令行工具keytooljarsinger Android Studio  小结 查看应用签名信息 查看自签名证书的信息 查看第三方应用或Android系统应用签...
  • zinss26914
  • zinss26914
  • 2015年11月26日 15:23
  • 8717

android安全学习之1—什么是数字签名、数字证书

概对加解密机制进行了学习,以下是自己对一些概念的理解。 加密: 加密就是为了让别人看不懂,加密前的东东称为明文,加密后的为密文。例如我把写给susan的信进行了加密,明文是:12,经过加密...
  • guilanl
  • guilanl
  • 2016年08月16日 16:16
  • 1214

Android Studio 打包以及获取数字签名

、打包 (1)Android Studio菜单Build->Generate Signed APK  (2)弹出窗口  (3)创建密钥库及密钥,创建后会自动选择刚创建的密钥库和密...
  • Tom_xiaoxie
  • Tom_xiaoxie
  • 2016年03月18日 11:40
  • 2474

Android数字签名解析(一)

一、数字签名概述 所谓"数字签名"就是通过某种密码运算生成一系列符号及代码组成电子密码进行签名,来代替书写签名或印章。 数字签名有两种功效:一是能确定消息确实是由发送方签名并发...
  • u010223349
  • u010223349
  • 2014年06月07日 16:27
  • 2100

通过Eclipse对Android项目生成APK数字签名

Android APK数字签名作用    1) App升级。 使用相同签名的升级软件可以正常覆盖老版本的软件,否则系统比较发现新版本的签名证书和老版本的签名证书不一致,不会允许新版本安装成功的。  ...
  • u012768554
  • u012768554
  • 2015年03月08日 22:07
  • 984

数字签名与数字证书形象解释

前言 先看一下百度百科对数字签名和数字证书的解释: 数字签名: 将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证:只要改动报文中任何一位,重新计算出的报文摘要值就会...
  • liuweiyuxiang
  • liuweiyuxiang
  • 2016年10月07日 11:30
  • 825

Android安全加密:数字签名和数字证书

Android安全加密专题文章索引 Android安全加密:对称加密 Android安全加密:非对称加密 Android安全加密:消息摘要Message Digest Android安全加密:数字签名...
  • axi295309066
  • axi295309066
  • 2016年09月10日 14:25
  • 7823

Win10 如何连接Android 手机平板--驱动安装数字签名失败解决方案

电脑升级Win10 后,各种不习惯; 电脑不能连接手机(华为) MTP, ADB 不能使用。解决方案如下: 点击通知,找到并进入“所有设置”。 ...
  • kevinx_xu
  • kevinx_xu
  • 2016年07月05日 09:37
  • 2242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android数字签名
举报原因:
原因补充:

(最多只允许输入30个字)