Android中签名、证书、公钥密钥的概念及使用

资料来源于Android 官方文档的:https://developer.android.com/studio/publish/app-signing.html
还有些资料来源于网络。加以整理!html

公钥和私钥的概念

在现代密码体制中加密和解密是采用不一样的密钥(公开密钥),也就是公开密钥算法(也叫非对称算法、双钥算法)”,每一个通讯方均须要两个密钥,即公钥和私钥,这两把密钥能够互为加解密。公钥是公开的,不须要保密,而私钥是由我的本身持有,而且必须妥善保管和注意保密。android

证书的概念

数字证书则是由证书认证机构(CA)对证书申请者真实身份验证以后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(至关于加盖发证书机 构的公章)后造成的一个数字文件。CA完成签发证书后,会将证书发布在CA的证书库(目录服务器)中,任何人均可以查询和下载,所以数字证书和公钥同样是公开的。实际上,数字证书就是通过CA认证过的公钥。算法

原则:安全

一、一个公钥对应一个私钥。

二、密钥对中,让你们都知道的是公钥,不告诉你们,只有本身知道的,是私钥。

三、若是用其中一个密钥加密数据,则只有对应的那个密钥才能够解密。

四、若是用其中一个密钥能够进行解密数据,则该数据必然是对应的那个密钥进行的加密。

五、非对称密钥密码的主要应用就是公钥加密和公钥认证,而公钥加密的过程和公钥认证的过程是不同的

基于公开密钥的加密过程服务器

好比有两个用户Alice和Bob,Alice想把一段明文经过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程以下:markdown

一、Bob将他的公开密钥传送给Alice。

二、Alice用Bob的公开密钥加密她的消息,而后传送给Bob。

三、Bob用他的私人密钥解密Alice的消息。

Android中的签名:

是什么签名?


Android要求全部已安装的应用程序都使用数字证书作数字签名,数字证书的私钥由应用开发者持有,
Android使用证书做为标示应用程序做者的一种方式,并在应用程序之间创建信任的关系。 证书并不用来控制用户可否安装哪一个应用。证书不须要由证书认证中心签名;彻底可使用自制签名证书。网络

没有正确签名的应用,Android系统不会安装或运行。此规则适用于在任何地方运行的Android系统,无论是在模拟器仍是真实设备上。由于这个缘由。在真机或模拟器上运行或者调试应用前,必须为其设置好签名。app

为何要有签名?


开发Android的人这么多,彻底有可能把类名,包名命名成一样的名字,这个时候该如何区分?因此,这时候就须要签名来区分了,因为开发商可能经过使用相同的Package Name来混淆替换已经安装的程序,签名能够保证至关名字,可是签名不一样的包不被替换。
发布过Android应用的朋友们应该都知道,Android APK的发布是须要签名的。签名机制在Android应用和框架中有着十分重要的做用。例如,Android系统禁止更新安装签名不一致的APK;若是应用须要使用system权限,必须保证APK签名与Framework签名一致。框架

签名策略


应用程序签名的一些方面可能会影响应用程序的开发过程, 尤为是当你计划发布多个应用时. 一般状况下, 对于全部开发者而言,推荐的策略是:在应用程序的整个生命周期,全部的应用程序使用相同的证书签名.模块化

为何这么作的缘由:

  • 应用程序升级 – 当发布应用的更新时, 若是想让用户无缝地升级到新版本, 须要继续使用相同的某个或者某一套证书来签名更新包.当系统安装应用的更新时, 它会比较现有版本和新版本的证书. 若是证书吻合, 包括证书数据和顺序都吻合, 那么系统容许更新.若是新版本所作的签名不是匹配的, 那么将须要给应用起一个不一样的包名 — 在这种状况下, 用户至关于安装了一个彻底的新程序.
  • 应用程序模块化 – Android容许由相同证书签名的应用程序运行在相同的进程中, 此时系统会将它们做为单个应用程序对待.在这种方式中, 能够按模块化的方式部署应用, 用户能够根据须要独立地更新每个模块.
  • 代码/数据 的受权共享 – Android 提供模式匹配的权限控制机制,所以一个应用能够暴露功能给另外一个用指定证书签名的应用. 经过用相同证书签名多个应用,以及使用模式匹配的权限检查,应用程序能够以安全的方式共享代码和数据.

另外一个影响签名策略的重要考量是, 如何设置签名应用的key的有效期.

  • 若是计划为某个单独的应用程序提供更新支持, 那么应该确认key的有效期要比应用的寿命长. 推荐25年或者更长的有效期.当key的有效期过时, 用户将不再能无缝地更新到应用程序的新版本.
  • 若是要使用相同的key为多个不一样的应用签名, 应当确认key的有效期比全部这些应用的全部版本的生命周期还长,包括要比未来加到这个套件中的额外的关联应用的生命周期更长.
  • 若是计划将应用程序发布到Android Market, 为应用签名的key的有效期必须在2033年10月22日之后.Market服务器强制执行这个规则, 来保证当新版本可用时, 用户能够无缝地更新Market应用.

当设计的时候, 须牢记这些要点, 以确保使用合适的证书来签名应用程序。

Debug模式下的签名


运行或从IDE调试项目时,Android的Studio会自动由Android SDK工具生成的调试证书签名的APK。您运行或调试Android Studio中的项目第一次,IDE会自动在调试密钥库和证书 $HOME/.android/debug.keystore,并设置密钥库和密钥的密码。

由于Debug模式下的证书由构建工具建立,这样是不安全的,大部分应用程序商店(包括谷歌Play商店)不会接受的APK有出版调试证书签名。

因此你不用每次调试时都输入的Android Studio自动存储在签约配置调试签约信息。签名的配置是由全部必要的信息,以签署APK,包括密钥存储位置,存储密码,密钥名称,密钥密码的对象。您不能直接编辑调试签约配置,但能够配置你如何签上你的发布版本。

有关如何构建和调试运行的应用程序,看到更多的信息, 生成并运行您的应用程序。

调试证书到期


用来签署APK调试的自签名证书有365天,从它的建立日期的截止日期。证书过时后,你在构建的时候会报错的。

为了解决这个问题,只需删除该debug.keystore文件。该文件存储在如下位置:

~/.android/ 在OS X和Linux
C:\Documents and Settings\<user>\.android\ 在Windows XP上
C:\Users\<user>\.android\ 在Windows Vista和Windows 7,8,和10

接下来,你构建和运行调试版本的时候,构建工具将从新生成一个新的秘钥库和Debug key,请注意!你必须运行你的程序,否则就不会从新生成秘钥库和Debug key。

发布版的签名

你可使用AndroidStudio 来手动生成签名的apk,可是这样每次发布不一样的版本的时候就都手动生成一次,比较麻烦的,因此,咱们还能够配置Gradle文件,在构建的过程当中会自动签名。

在AndroidStudio中要手动生成签名的apk,按照如下步骤:
1. 在菜单栏中,Build > Generate Signed APK
这里写图片描述
2. 选择您想从下拉释放下来,而后单击模块 下一步。
3. 若是你已经有一个密钥库,请转到步骤5.若是你想建立一个新的密钥库,单击 新建。
4. 在新的密钥库窗口,为您提供密钥库和密钥如下信息,如图1所示。
这里写图片描述
图1。建立Android Studio中一个新的密钥库。

Keystore

  • Key store path::选择您的密钥存储应该建立的位置。
  • Password:建立并确认您的密钥库安全的密码。

Key

  • Alias:你的Enter键的标识名称。
  • Password: 建立并确认你的密钥的安全密码。这应该是从你选择你的密钥库的密码不一样
  • Validity (years):设置的时间长度在几年,你的key将是有效的。你的key应该是有效期至少为25年来,这样你就能够经过你的应用程序的寿命相同的密钥签名的应用程序更新。
  • Certificate:输入有关本身的一些信息,为您的证书。这个信息是否是在你的应用程序中显示,可是属于apk的一部分。
    填完上面信息,而后单击肯定。

在生成签名APK窗口中,选择一个密钥库,私钥,并输入密码两种。(若是在上一步中建立您的密钥库,这些字段已经为您填充。)而后单击 下一步。

这里写图片描述
图2。选择Android Studio中的私钥。

在下一个窗口中,选择签署的apk的输出目录,和签名的环境,而后单击 Finish(完成)。

这里写图片描述
图3。生成所选Flavors的APK。

该过程完成后,你会发如今你上面选择的目标文件夹已经有签名的APK。您如今能够经过一个应用市场,如谷歌Play商店,或使用你选择的机制分发签署的APK。

配置build.gradle文件自动签名你的apk


在Android Studio中,你能够经过build.gradle 配置来构建你的项目,在构建的过程当中会自动生成你的apk。步骤以下:

  1. 在当前你的项目,右键点击你的程序,而后打开Projec Structure,
  2. 再打开的窗口中,在模块的左侧面板中选择你想签署的Module。
  3. 选择你的密码存储文件,而后输入相关的信息;如图:
    这里写图片描述
    图4。用于建立新签名构造的窗口。
  4. 点击Ok。
  5. 而后在build types配置中 选择刚刚签名的配置。如图:
    这里写图片描述

最后点击ok。

而后AndroidStudio 自动构建编译,成功后能够在build/outputs/apk/为您构建模块项目目录内的文件夹中找到咱们输出的apk。

签名注意事项


你应该签名全部的APK与整个应用程序的寿命预期相同的证书。有几个缘由,你应该这样作:

  • 应用程序升级:当系统安装更新到一个应用程序,它在新版本中与那些在现有版本的证书(S)比较。该系统容许更新,若是证书相匹配。若是你用不一样的证书签名的新版本,你必须在不一样的包名称分配给应用程序,在这种状况下,用户安装新版本做为一个全新的应用程序。
  • 应用模块:若是是app,Android 容许同一证书签名在同一个进程中运行的APK,所以,系统会将其视为一个单一的应用程序。经过这种方式,你能够部署模块你的应用程序。
  • 代码/数据,经过共享的权限:Android提供了基于签名的权限执行,这样应用程序能够公开的功能到与指定的证书签名的另外一个应用程序。经过签署多个APK使用相同的证书,并使用基于签名的权限检查,您的应用程序能够在一个安全的方式共享代码和数据。

保护您的私钥


保护你的私钥的安全性是相当重要的,不管是你仍是用户,若是容许别人使用你的秘钥,或者你泄露你的秘钥文件,使得第三方找到他们并使用它们,那么你的app安全性将会受到损失~

做为一个开发者,在任什么时候候,都要保护好你的私钥,直到密钥已过时。如下是一些技巧让你的密钥的安全:

  • 选择不容易破解的密码,和keystore;
  • 不要给外人你的私钥和keystore文件;
  • 把他们放置在一个安全的地方。

删除签名信息


当你建立一个签名的配置的时候,Android的Studio将在纯文本模块的您的签名信息build.gradle的文件。若是你是一个团队或用你的代码工做,你应该让它变成一个不容易给别人访问的移动的文件。要作到这一点,你应该建立一个单独的属性文件来存储安全的信息,

建立一个文件名 ​​为keystore.properties在项目的根目录。这个文件应该包含您的签名信息,以下所示:

storePassword = myStorePassword 
keyPassword = mykeyPassword 
keyAlias ​​= myKeyAlias 
​​storeFile = myStoreFileLocation

在你的模块的build.gradle文件中,添加的代码加载你keystore.properties的文件以前android 块。

...

// Create a variable called keystorePropertiesFile, and initialize it to your
// keystore.properties file, in the rootProject folder.
def keystorePropertiesFile = rootProject.file("keystore.properties")

// Initialize a new Properties() object called keystoreProperties.
def keystoreProperties = new Properties()

// Load your keystore.properties file into the keystoreProperties object.
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    ...
}

你可使用语法,来引用存储的签名信息:

android {
    signingConfigs {
        config {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    ...
  }

使用工具签名


若是你不用AndroidStudio来签名你的apk,你还可使用Android SDK 和 JDK 自带的工具,步骤以下:

  1. 使用keytool 生成私钥,例如:
$ keytool -genkey -v -keystore my-release-key.keystore
-alias alias_name -keyalg RSA -keysize 2048 -validity 10000

提示您输入密钥库和密钥的密码,并为你的key设置别名。而后生成密钥库做为一个名为my-release-key.keystore。密钥库包含单个键,有效10000天。别名是签署您的应用程序时,您将在之后使用的名称。
2. 编译发布模式下您的应用程序,以得到一个无符号的APK。
3. 使用jarsigner来签名你的app:

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1
-keystore my-release-key.keystore my_application.apk alias_name

上面提示您输入密钥库和密钥的密码。而后签名apk。
4. 验证你的apk签名:

$ jarsigner -verify -verbose -certs my_application.apk


5. 使用zipalign来对齐apk包:

$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

zipalign 确保全部的未压缩数据与特定字节对齐相对于文件,从而下降apk文件的大小。

学习理解并整理下来的笔记。
但愿你们可以指点或提出宝贵意见,谢谢!一块儿学习。
转载请注明出处:http://blog.csdn.net/u011974987/article/details/52415037
我的站点:xuhao.tech

相关文章
相关标签/搜索