Android 签名机制

一、签名的作用

  1. 升级应用。只有以同一个证书签名,系统才会允许安装升级的应用程序。(升级时签名证书和包名都要相同)。
  2. 防止应用被恶意篡改。只有签名相同的文件才能覆盖安装。
  3. 应用程序模块化。同签名的多个应用,可运行在同一个进程中,此时可以把应用程序以模块的方式进行部署,用户可独立升级其中的一个模块。
  4. 代码/数据共享。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,就可以在应用程序间以安全的方式共享代码和数据。
  5. 参考链接:Android APK签名有什么用呢?

二、签名是如何生成的

(一)加密算法

安卓签名的生成使用了加密算法,现在常见的加密算法主要有两大类:对称加密算法和非对称加密算法。
  1. 加密算法。数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。
  2. 对称加密算法。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
  3. 非对称加密算法。非对称加密算法需要两个密钥公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将公钥公开,需要向甲方发送信息的其他角色(乙方)使用该密钥(甲方的公钥)对机密信息进行加密后再发送给甲方;甲方再用自己私钥对加密后的信息进行解密。甲方想要回复乙方时正好相反,使用乙方的公钥对数据进行加密,同理,乙方使用自己的私钥来进行解密。
    另一方面,甲方可以使用自己的私钥对机密信息进行签名后再发送给乙方;乙方再用甲方的公钥对甲方发送回来的数据进行验签。甲方只能用其私钥解密由其公钥加密后的任何信息。
  4. 对称加密和非对称加密相比优缺点。非对称加密优点:算法强度复杂、安全性依赖于算法与密钥,有个公开密钥,相比于对称密钥,不用传输密钥,安全性高,缺点:加密解密速度没有对称算法快。

(二)数字签名和数字证书

Android签名机制涉及数据摘要、数字签名、数字证书。Android签名的过程:
首先,通过算法对信息(未签名的apk里面的所有文件)进行处理生成一个固定长度的输出,这个输出就是数据摘要;
然后,用私钥对摘要进行加密处理,得到数字签名;
最后在签名中加入数字证书,以保证公钥的安全发放。
  1. 数据摘要。数据摘要的定义是:通过算法,对信息进行运算,得到一个固定长度的输出。特点:输入不同摘要不同,并且无法通过摘要还原数据。生成摘要的主要算法:MD5、SHA1、SHA-256等。
  2. 数字签名定义:私钥加密后的消息摘要就是数字签名。作用:确定消息由发送方发出,不是恶意软件;确定完整性。
  3. 数字证书作用:保证公钥的安全发放,即正确性。认为某些有公信力的机构发放的证书是安全的,这些机构叫CA(Certificate Authority)。CA的私钥对 申请人的公钥 和 基本信息做签名 + 申请人的公钥 + 基本信息 = 证书。CA本身会生成一个自签名的根证书,内置在操作系统中,安装根证书意味着对这个CA认证中心的信任,信任后才可用CA公钥验证申请人的公钥是否正确。

(三)keystore、keytool

Android开发者使用AndroidStudio进行Android签名时用到keystore、keytool这两个东西。
  1. keystore密钥仓库。类似sqlite的一张表,存放了公私钥和相关信息,可以有很多条目。keystore有一个密码保护,其中的每个key也有密码保护,也就是要获得一个key的信息,需要两层密码。每个条目都有唯一的别名 alias ,不区分大小写。
  2. keytool。是 jdk 提供的操作 keystore 的工具。

(四)签名的三个文件

Android签名会生成三个文件:MANIFEST.MF、CERT.SF、CERT.RSA
  1. MANIFEST.MF。对未签名的 apk 里面的所有文件分别进行 hash,以文件为单位。
  2. CERT.SF。对MANIFEST.MF的每个结果再计算 hash。
  3. CERT.RSA。对CERT.SF的每一条结果计算hash 并通过keystore里面的私钥进行加密。

三、实操:怎么生成签名

(一)命令行

  1. 进入jdk/bin目录下
  2. keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore
  3. 按2后的提示继续输入

(二)as生成签名

  1. AS中build->Generate Signed APK…
  2. Create new…
  3. 填写签名文件地址、文件密码、key名字、key密码

(三)获取设备SHA1码

  1. keytool -list -v -keystore jks文件路径
  2. 输入密钥库密码
  3. 获取到SHA1码及相关信息

四、Android签名机制详解

Android中的签名和签名文件的生成过程