什么是签名?

Android 要求所有已安装的应用程序都使用数字证书做数字签名,数字证书的私钥由开发者持有。

Android 使用证书作为标识应用程序作者的一种方式,证书不需要由证书认证中心签名,使用自制签名证书。

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

两种签名:

1、调试模式下签名   (sdk 为应用主动生成一个签名证书,调试模式下签名的应用不能对外发布,因为由构建工具创建的证书是不安全的,应用商店不接受调试证书签名的apk)

2、公布模式下签名 (需要生成自己的证书)

注:给自己开发的app签名,就代表着我们自己的版权,之后要进行升级,也必须要使用相同的签名才可以,签名代表着自己的身份(即 keystore,是一个包括私人秘钥集合的二进制文件),创建的keystore 多个app可以使用同一签名。


为什么要有签名?

开发Android的人众多,完全有可能把雷鸣、包名命名成相同的名字,需要签名来区分,由于开发商可能通过使用相同包名来混淆替换已经安装的程序,签名可以保证相同名字,但是签名不同的包不被替换。

签名机制在Android应用和框架中有着十分重要的作用,例如:Android系统禁止跟新安装签名不一致的apk,若应用需要使用system权限,必须保证apk签名与framwork签名一致。


为什么要这么做?

  •  应用程序升级 -  当发布应用的更新时,如果想染给用户无缝的升级到新版本,需要继续使用相同的某个或某套证书来签名更新包,当系统安装应用的更新时,它会比较现在的版本和新版本的证书,如果证书吻合,包括证书数据和顺序都吻合,那么系统允许更新,如果新版本所做的签名不是匹配的,那么将需要给用起一个不同的包名 - 在这种情况下,用户相当于安装了一个完全新的程序。
  • 用用程序模块化 - Android允许相同证书签名的应用程序运行在相同的进程中,此时系统会将它们作为耽搁应用程序对待,在这种方式中,可以按模块化的凡事部署应用,用户可以根据需要独立的跟新每一个模块。
  • 代码、数据的授权共享 - Android提供模式匹配的权限控制机制,因此一个应用可以暴露功能给另一个用指定证书签名的签名的应用,通过用相同证书签名多个应用,以及使用模式匹配的权限检查,应用程序可以以安全的方式共享代码和数据。


公钥和私钥的概念

在现代密码体制中加密和解密是采用不同的秘钥(公开秘钥),也就是公开秘钥算法(也叫非对称算法、双钥算法),每个通信方均需要两个秘钥,即公钥和私钥,这两个秘钥可以互为加解密,公钥是公开的,不要保密,而私钥是由个人自己持有,并且必须妥善保管和注意保密的。


证书的概念

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

原则:

  • 一个公钥对应一个私钥
  • 秘钥对中,让大家都知道的是公钥,不告诉大家只有自己知道的是私钥
  • 如果用其中一个秘钥可以解密,那么该数据必须是对应的秘钥进行的加密
  • 非对称秘钥密码的主要应用就是公钥加密和公钥认证,而公钥加密的过程和公钥认证的过程是不一样的

例:两个用户 A 和 B ,A要把一段明文通过双钥加密的技术发送给 B , B有一对公钥和私钥,那么加密解密过程如下

    1. B 将他的公钥传送给A

    2. A 用 B 的公钥加密的他的消息,然后传送给 B

    3. B 用他的私钥解密 A 的消息


调试版相关问题

证书到期问题:用来签署apk调试的自签名证书有效期365天,到期后只需删除该debug.keystore文件。

文件存储位置 --- OS 和 Linux 系统:~/.android /

                     --- windows 7, 8, 10 : C:\Users\\.android\


发布版的签名

1. 手动生成签名的 apk (使用 Android Studio 手动生成签名的 apk,每次发布不同版本的时候都需要手动生成一次,比较麻烦)

步骤如下:

    1> 在Android Studio菜单栏中,Build --> Generate Signed APK

        

    2>如果你已经有一个秘钥库,请转到步骤4,如果你想创建一个新的秘钥库,单击新建

        

    注:Key store path: 秘钥库存储位置

           Key store password:秘钥库安全密码

           Key alias:秘钥标识名称

           Key password: 秘钥安全密码

           秘钥安全密码应当与秘钥库安全密码不同


    3>创建新的秘钥库如下图

         

    

    注:秘钥的有效时间设置以年为单位,应至少为25年,以便您可以在应用的整个生命周期内使用相同的秘钥签署应用更新

    Certificate 部分是为证书输入关于您自己的信息,此信息不会显示在应用中,但会作为apk的一部分包含在您的证书中

    Firstand Last Name 秘钥颁发者姓名

    OrganizationalUnit 秘钥颁发者组织单位

    Organization 组织

    Cityor Locality 城市

    State or Province 市或洲

    CountryCodeXX 国家代码


    4>在生成签名apk窗口中,选择秘钥库、秘钥,并输入两个密码(如果是新创秘钥,这些字段会自动填充)然后单击xiayi

    

    


    5>选择签署的apk目的地,构建类型,产品风味,单击完成


    

    

    APK Destination Folder 为签署的APK选择一个目的地


    Build Type 选择构建的类型(两种类型调试和正式


    Flavors 选择产品风味(即我们平时所说的发布平台,Android将为选择的每个产品风味生成单独的apk

    Signature Versions 签名版本勾选 Android7.0中引入了APKSignature Scheme v2

    

    说明:v1:应用是通过zip条目进行验证,这样apk签署后可进行许多修改 - 可以移动甚至重新压缩文件

    v2:验证压缩文件的所有字节,而不是单个zip条目,签名后无法再更改


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

步骤如下:

    1>Android Studio 菜单栏 File --> Project Structure ( 快捷键 ctrl+alt +shift +s)

    2>选中app这个module,然后切换到singning标签栏,然后点击添加,生成release签名信息,点击ok

    

    3>切换到Build Types 标签,将Signing config 选为“release”,即将刚刚生成的release签名信息配置进去

    

    

    4>随后我们可以看到app这个module的build.gradle文件多出了如下部分代码

      


    5>然后执行菜单栏的“build --> clean Project”



6>生成release版本的apk,在命令行terminal输入gradlew assembleRelease (AS已经将命令行Terminal 继承到了软件当中)运行成功的话,效果如下:



7> 生成签名好的文件在如下位置:




更多相关文章

  1. Android的搜索框架实例详解
  2. 第三部分:Android(安卓)应用程序接口指南---第二节:UI---第十一章
  3. Android(安卓)-- SurfaceFlinger 概要分析系列 (一)
  4. Android之仿小米便签程序
  5. Android中的搜索(search)概述
  6. android项目目录介绍之二
  7. 如何让Android程序支持安装到SD卡(APP2SD)
  8. Android应用程序UI硬件加速渲染环境初始化过程分析
  9. Android(安卓)Architecture Component Room持久化数据库(五)迁移Ro

随机推荐

  1. Launcher开发笔记4—壁纸
  2. Android Studio基础之项目目录结构(四)-
  3. Android 运行出错
  4. 【Android】Android Clean Architecture
  5. Android OpenGL例子学习
  6. Android使用百度地图SDK获得当前设备位置
  7. Android逆向分析常用网站
  8. Linux系统Android SDK 下载版本,报错Warni
  9. android(2.0以后版本) 中读取联系人和通
  10. 更新SDK后eclipse报错This Android SDK r