签名的必要性

1、  防止你已安装的应用被恶意的第三方覆盖或替换掉

2、  开发者的身份标识,签名可以防止抵赖等事件的发生。

开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的。另外由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,签名这时可以可以防止你已安装的应用被恶意的第三方覆盖或替换掉。因而APK如果使用一个key签名,发布时另一个key签名的文件将无法安装或覆盖老的版本。

签名方式

签名有很多种方式,常见的有:

1、  在Eclipse下通过插件获取数字证书,并签名你的应用。

打开Eclipse->选择你要签名的项目->右击->android tools->Export signedApplication package,再进行相关操作。这里首先需要创建数字证书,然后再利用数字证书签名你的应用。

运气好时,你会发现签名失败,却怎么也找不到原因。本人之前就遇到过这种情况,也困惑过好久,最终才发现是插件出问题了,抓狂。那你不妨使用下面一种方法。

2、  用KeyTool产生数字证书文件,再签名你的应用。

命令:

  1. keytool -genkey -v -keystore D:\Users\Administrator\Desktop\mytest.keystore-alias mytest -keyalg RSA -validity 20000

其中参数含义如下:

  1. -keystore D:\Users\Administrator\Desktop\mytest.keystore表示生成的证书及其存放路径,默认在用户主目录下;
  2. -alias mytest 表示证书的别名是mytest;
  3. -keyalg RSA 表示采用的RSA算法;
  4. -validity 20000表示证书的有效期是20000天。

这样你就会在相应目录下获得所需的数字证书,如上图所示。

获取到数字证书之后,你就可以用数字证书去签名你的应用,签名步骤如下:

右击工程 --> 选择Android Tools --> Export Signed Application Package --> 选择next  --> 选择Use existing keystore,并填写数字证书位置,以及密码,再next --> using existing key,选择alias,以及密码,再next --> 选择程序存放位置后完成。

补充:

 

有时你可能还需要得到证书指纹(MD5和SHA1)。

1、获取证书指纹(MD5)命令:

  1. keytool -list -alias mytest -keystore D:\Users\Administrator\Desktop\mytest.keystore

2、获取证书指纹(SHA1)命令:

  1. keytool -v -alias mytest -keystore  D:\Users\Administrator\Desktop\mytest.keystore

3、这两条命令只是参数不同,你也可以同时获取证书指纹(MD5和SHA1),当然-alias后面的别名一定要跟前面的对应。命令如下图所示:

数字证书简介:

 

Android数字证书包含以下几个要点:

 

在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序,数字证书的私钥则保存在程序开发者的手中。这个数字证书并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。如果一个permission的protectionLevel为signature,那么就只有那些跟permission所在的程序拥有同一个数字证书的应用程序才能取得该权限。

Android使用Java的数字证书相关的机制来给apk加盖数字证书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机制。Android系统要求每一个安装进系 统的应用程序都是经过数字证书签名的, Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系。
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序。
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证。

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

Android的开发工具(ADT插件和Ant)都可以协助开发者给apk程序签名,它们都有两种模式:调试模式(debug mode)发布模式(release mode)。在调试模式下,android的开发工具会在每次编译时使用调试用的数字证书(default.keystore)给程序签名,开发者无须关心。当要发布程序时,开发者就需要使用自己的数字证书给apk包签名。因此,当我们在开发微信分享功能时候,需要使用发布模式。如果不使用自己生成的数字证书,你将只能在第一次分享成功,以后就一直调不出分享的界面。

(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后。
(5)Android使用标准的java工具Keytool和Jarsigner来生成数字证书,并给应用程序包签名。

(6)使用zipalign优化程序。

有关签名密钥(证书)与发行包名变化可能有如下限定:

 

下面是我自己测试的结果,跟网上的一些资料有些出入,个人认为包主要判断是否属于同一应用,然后签名用来判断程序所属者,判断是否属于不同版本。有任何问题,欢迎轻拍。

1、包名相同,签名相同:安装时可覆盖安装(就是同一程序同一版本)。

2、包名相同,签名不同:Android认为版本发生了变化,需先卸载再安装(同一程序不同版本)。

3、包名不同,签名相同:正常安装。

4、包名不同,签名不同:正常安装。

程序覆盖安装检查:

(1)、两个程序的入口Activity是否相同。两个程序如果包名不一样,即使其它所有代码完全一样,也不会被视为同一个程序的不同版本;

(2)、两个程序所采用的签名是否相同。如果两个程序所采用的签名不同,即使包名相同,也不会被视为同一个程序的不同版本,不能覆盖安装。

总结一下就是:签名、包名相同,需覆盖安装。

这里有一个很简单的例子:当我们在公司开发时,在自己电脑上调试的手机,多次调试时不需要卸载(此时是覆盖安装)。而当其他人拿了这个手机去他电脑上调试时,就需要先卸载该程序(必须卸载安装)。当你以前的程序是采用默认签名的方式(即debug签名),一旦换了新的签名应用将不能覆盖安装,必须将原先的程序卸载掉,才能安装上。

因此使用debug签名的应用:无法在Android市场销售;而且,不同机器生成的debug密钥不同,不利apk升级和维护;debug签名有一年有效期。使用独立签名的应用:可在Android市场销售,签名固定会更加便利apk升级和维护。

参考资料:

http://blog.csdn.net/wirelessqa/article/details/7651613

http://blog.csdn.net/lyq8479/article/details/6401093

http://blog.csdn.net/wenlin56/article/details/8153301

android利用数字证书对程序签名的更多相关文章

  1. android 利用数字证书对程序签名

    签名的必要性 1.  防止你已安装的应用被恶意的第三方覆盖或替换掉. 2.  开发者的身份标识,签名可以防止抵赖等事件的发生. 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样 ...

  2. android利用adb安装应用程序出现“more than one device and emulator wait for device ”

    今天,写自动化脚本时,因在这之前进行了一下真机版本的更新,还没有从电脑上拔出,就又在adt打开了一个AVD. 于是,自由自在的就去写脚本了,企图在emulator上装一个APK,在cmd窗口下,利用: ...

  3. 【转】Android数字证书

    Android数字证书的作用是非常重要的.Android操作系统每一个应用程序的安装都需要经过这一数字证书的签名. Android手机操作系统作为一款比较流行的开源系统在手机领域占据着举足轻重的地位. ...

  4. IONIC 开发的Android应用程序签名(或重新签名)详解

    完全通过DOS命令来完成apk签名 给apk签名一共要用到3个工具,或者说3个命令,分别是:keytool.jarsigner和zipalign,下面是对这3个工具的简单介绍:            ...

  5. Android应用程序签名详解 简介

    转自: http://blog.csdn.net/lyq8479/article/details/6401093 本文主要讲解Android应用程序签名相关的理论知识,包括:什么是签名.为什么要给应用 ...

  6. Android 应用程序签名

    本文主要介绍Android应用程序签名的相关理论知识以及怎样公布Android应用程序. 1.签名的概念 为大家所熟知的日常生活中的签名,它是代表某个人的特殊标记,用于唯一标识某个人.而Android ...

  7. Android应用程序签名详解

    http://blog.csdn.net/lyq8479/article/details/6401093 本文主要讲解Android应用程序签名相关的理论知识,包括:什么是签名.为什么要给应用程序签名 ...

  8. 一篇读懂HTTPS:加密原理、安全逻辑、数字证书等

    1.引言 HTTPS(全称: Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.本文,就来深入介绍下其 ...

  9. https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名

    声明:本文章已授权公众号Hollis转载,如需转载请标明转载自https://www.cnblogs.com/wutianqi/p/10654245.html(安静的boy) 一.为什么要使用http ...

随机推荐

  1. 研究Dropbox Server端文件系统

    一.传统文件系统 可以理解成两部分:1.真正的storage区,被分割成n个扇区:2.文件系统,其实就是一个FAT表. 二.Dropbox的文件系统 例如,一个modeo.mov的文件,大小为15M. ...

  2. 虚拟目录里面的webconfig不继承网站的设置

    必須在上一层虚拟目录(如根目录,上级网站)所在的Web.config加上 如:<location path="." allowOverride="false&quo ...

  3. Unity3D的LightProbe动态光探头用法介绍

    原地址:http://liweizhaolili.blog.163.com/blog/static/16230744201371721511106/ 之前曾经介绍过Unity3D的LightMappi ...

  4. java多线程基础知识

    1.ThrTest.java 继承Thread类方式 public class ThrTest extends Thread { private String name; public ThrTest ...

  5. 【六】PHP正则表达式方法

    PHP中正则表达式的声明格式有两种方式,一种是POSIX老版模式,已经不常用.还有一种是其他语言中常见的PCRE方法. 1.正则表达式的匹配方法并返回匹配的项:array preg_grep(stri ...

  6. jQuery对象和javascript对象互换

    jquery变js var obj=$("dom"); 或 var obj=jQuery("dom"); js 变 jquery var $jobj=$(obj ...

  7. HDU 2529 Shot (物理数学题)

    题目 解题过程: //物理数学题 #include<stdio.h> #include<string.h> #include<algorithm> using na ...

  8. Linux下Sublime Text 2的安装

    安装方法1: 通过apt-get install来安装,可以如下来做: sudo add-apt-repository ppa:webupd8team/sublime-text-2 sudo apt- ...

  9. Windows 回调监控 <一>

    在x86的体系结构中,我们常用hook关键的系统调用来达到对系统的监控,但是对于x64的结构,因为有PatchGuard的存在,对于一些系统关键点进行hook是很不稳定的,在很大几率上会导致蓝屏的发生 ...

  10. 【zoj2562】反素数

    题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最小的一个.(1 <= n <= 10^16) 题目:http://acm.hust.edu. ...