资料来源于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系统,无论是在模拟器仍是真实设备上。由于这个缘由。在真机或模拟器上运行或者调试应用前,必须为其设置好签名。app
开发Android的人这么多,彻底有可能把类名,包名命名成一样的名字,这个时候该如何区分?因此,这时候就须要签名来区分了,因为开发商可能经过使用相同的Package Name来混淆替换已经安装的程序,签名能够保证至关名字,可是签名不一样的包不被替换。
发布过Android应用的朋友们应该都知道,Android APK的发布是须要签名的。签名机制在Android应用和框架中有着十分重要的做用。例如,Android系统禁止更新安装签名不一致的APK;若是应用须要使用system权限,必须保证APK签名与Framework签名一致。框架
应用程序签名的一些方面可能会影响应用程序的开发过程, 尤为是当你计划发布多个应用时. 一般状况下, 对于全部开发者而言,推荐的策略是:在应用程序的整个生命周期,全部的应用程序使用相同的证书签名.模块化
为何这么作的缘由:
另外一个影响签名策略的重要考量是, 如何设置签名应用的key的有效期.
当设计的时候, 须牢记这些要点, 以确保使用合适的证书来签名应用程序。
运行或从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
在生成签名APK窗口中,选择一个密钥库,私钥,并输入密码两种。(若是在上一步中建立您的密钥库,这些字段已经为您填充。)而后单击 下一步。
图2。选择Android Studio中的私钥。
在下一个窗口中,选择签署的apk的输出目录,和签名的环境,而后单击 Finish(完成)。
图3。生成所选Flavors的APK。
该过程完成后,你会发如今你上面选择的目标文件夹已经有签名的APK。您如今能够经过一个应用市场,如谷歌Play商店,或使用你选择的机制分发签署的APK。
在Android Studio中,你能够经过build.gradle 配置来构建你的项目,在构建的过程当中会自动生成你的apk。步骤以下:
最后点击ok。
而后AndroidStudio 自动构建编译,成功后能够在build/outputs/apk/为您构建模块项目目录内的文件夹中找到咱们输出的apk。
你应该签名全部的APK与整个应用程序的寿命预期相同的证书。有几个缘由,你应该这样作:
保护你的私钥的安全性是相当重要的,不管是你仍是用户,若是容许别人使用你的秘钥,或者你泄露你的秘钥文件,使得第三方找到他们并使用它们,那么你的app安全性将会受到损失~
做为一个开发者,在任什么时候候,都要保护好你的私钥,直到密钥已过时。如下是一些技巧让你的密钥的安全:
当你建立一个签名的配置的时候,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 自带的工具,步骤以下:
$ 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