Android签名机制

原文地址:www.jianshu.com/p/fa0e2273f…android

不少人只知道开发完以后签名发布,签名就生成一个keystore文件就行,而不太清楚具体的签名流程,如今我就在这边简单过一遍流程。 本章节只讲流程,不会详细的去分析签名的源码,而且可能某些细节说得不对,但整体流程确定就是那么一回事,若是有不对的地方还但愿有大佬可以指点。算法

一.概念

开始以前咱们先来简单了解几个重要的概念,有助于理解android的签名流程。安全

1.加密

数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,一般称为"密文",使其只能在输入相应的密钥以后才能显示出原本内容,经过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 加密通常分为对称加密和非对称加密。 通常非对称加密更为安全,而通常非对称加密的操做是用公钥进行加密,接收端用私钥进行解密。函数

2.消息摘要

又称数字摘要或数字指纹。简单来讲就是任意长度数据通过单向的HASH函数,生成一个固定长度的HASH值。也就是通过算法处理后的一个固定长度的数据。工具

3.数字签名

数字签名的做用就是保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。数字签名技术是将摘要信息用发送者的私钥加密,与原文一块儿传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息而后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。若是相同,则说明收到的信息是完整的,在传输过程当中没有被修改,不然说明信息被修改过,所以数字签名可以验证信息的完整性。 和加密相比正好返过来,是用私钥加密,用公钥解密。ui

4.数字证书

数字证书就是互联网通信中标志通信各方身份信息的一串数字。简单来讲就是能证实通讯方的身份,能肯定和我通讯的是你,而不是某个假冒你的人。 假如你这边把应用用私钥签名,把签名后的文件和公钥都发给接收端。可是若是中间有人拦截,把文件换了,从新用本身的私钥签名,再换对应的公钥发给接收端。接收端依旧能正常校验成功,难道这就说明这个文件是正确的吗?因此才须要数字证书来证实这个公钥来自于真正的发送端。编码

二. 签名过程

单单这样讲这些概念,仍是有点难以理解,咱们就用签名的各个步骤来加深上面的每一个概念。加密

1. android签名的工具

android有两种签名工具jarsigner和signapk。jarsigner在JDK里面,apksigner在build-tools里面,具体的路径能够自行百度,由于我不敢保证全部版本的路径是固定不变的。 jarsigner会生成keystore,也就是咱们用AS的签名能生成keystore。signapk能生成pk8和pem。这两方也是能够转换的。3d

2. 签名和校验大概流程

按抽象来讲(这是按个人理解,也行细节上有些差异),签名和校验的大概过程是,发送者把文件用算法生成摘要,再用私钥对摘要进行加密,把证书、文件、加密串、公钥发给接收端。接收端获取到以后,根据证书认真发送者身份,用公钥对加密串进行解密,再对文件也用算法生成摘要,对比解密以后的信息和摘要的信息是否相同。网上有张图挺形象的描述这个过程。 cdn

3. android签名生成的三个文件

对代码签名以后会生成三个文件:MANIFEST.MF、CERT.SF和CERT.RSA。 若是你解压apk或者反编译apk的话会看到一个META-INF文件夹,打开里面就包含这3个文件

这三个文件是在签名过程当中生成的。 这里就抽象讲讲生成过程,不说源码,网上也不少讲这3个文件的生成代码。

(1)MANIFEST.MF

MANIFEST.MF的内容是全部文件进行SHA-1(这是一个Hash算法)以后再base64编码以后的值。去遍历全部文件,一个一个文件夹遍历,要是有文件,就SHA-1再base64。不管你每一个文件长度怎样,每一个文件都会生成一个固定长度的值,再把这些值一行一行记录下来(固然除了全部文件还有其余的属性,这个能够自行百度)。

能够看出这个过程就是一个获取摘要的过程,把不固定长度的文件生成固定长度的字符串。

(2)CERT.SF

其实就是将MANIFEST.MF文件按必定规则再进行SHA-1以后再base64。

SHA1-Digest-Manifest属性是对整个MANIFEST.MF文件作SHA1再base64生成的串。 以后的每一个SHA1-Digest是对MANIFEST.MF的各个条目作SHA1再用base64。 因此这个过程仍是一个获取摘要的过程。

(3)CERT.RSA

能够看出CERT.RSA不一样于上边两个文件,是一个加密串。 CERT.RSA包含了不少东西。CERT.SF文件用私钥加密,而后把数字证书,公钥等一块儿组合在一块儿生成CERT.RSA。 能够看出这是一个用私钥加密的过程。

4. 签名验证的过程

安装的时候,会验证这三个文件,判断是否完整,这个其实很好理解。 咱们通常会经历过这样的一种状况,咱们手机已经安装过一个文件,若是用不一样的签名就会安装出错,若是使用相同的签名就能覆盖安装。 安装时先会去查找是否已安装过相同的包名的应用,而后拿到证书指纹和要安装应用的证书指纹进行判断,相同的话说明是同一个应用。 至于指纹证书的原理我也不是很懂,在网上看到有人说是jks中X509证书的摘要信息,也有说是证书发行者对证书的数字签名。 而这些信息会存在CERT.RSA中,因此这个校验过程是在校验CERT.RSA的时候操做的。

大概的一个签名和验证的过程基本就是这样。

相关文章
相关标签/搜索