签名的必要性

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. xmlns与targetNamespace

    xmlns与targetNamespace xmlns与targetNamespacehttp://blog.sina.com.cn/weatry在使用XML Schema生成XML文件时,我们常常会 ...

  2. Apache CXF实现Web Service(3)——Tomcat容器和不借助Spring的普通Servlet实现JAX-RS(RESTful) web service

    起步 参照这一系列的另外一篇文章: Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 首先 ...

  3. ISIN编码

    国际证券识别编码(ISIN编码)是由国际标准化组织(ISO)制定的证券编码标准,并在<证券及相关金融工具-国际证券识别编码体系>(ISO6166)中正式发布.ISO6166主要规定了ISI ...

  4. 7 天玩转 ASP.NET MVC — 第 7 天

    目录 第 1 天 第 2 天 第 3 天 第 4 天 第 5 天 第 6 天 第 7 天 0. 前言 今天是开心的一天.因为我们终于来到了系列学习的最后一节.我相信你喜欢之前的课程,并从中学到了许多. ...

  5. Subclasses

    Given a collection of numbers, return all possible subclasses. public class Solution { public List&l ...

  6. laravel笔记

    向视图中传递变量 使用with()方法 return view('articles.lists')->with('title',$title); 直接给view()传参数 return view ...

  7. 有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取

    点这里 阅读目录 用 AngularJS(以及其它 JavaScript 框架)开发的 Web 站点不支持爬虫的抓取 解决方案 为什么公开我们的解决方案 实现 AngularJS 服务 结论   Pr ...

  8. JMeter性能测试介绍学习一

    上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站是fnng.cnblogs.co ...

  9. JavaScript. The core.

    Read this article in: Japanese, German (version 2), Arabic, Russian, French, Chinese. An object A pr ...

  10. C#获取当前路径的方法

    C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...