一、APK签名简介
1.APK签名的作用
- 使用特殊的key签名可以获取一些特殊的权限
- APK如果使用一个key签名,发布另一个key签名的文件将无法安装或覆盖老的版本。
- 应用程序升级,只有以同一个证书签名,系统才会允许安装升级的应用程序。
- 应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序。
2.签名方式
常用的签名方式:
- V1签名:基于JAR的签名。
1: keystore(使用jarsigner工具)
2:.pk8+.x509.pem(使用signApk.jar)。
生成签名后在apk 的META-INF文件夹下会生成下图中三个文件。
MANIFEST.MF是除了三个文件(MANIFEST.MF,CERT.RSA,CERT.SF),其他的文件都会对文件内容做一次SHA1算法,然后用Base64对SHA1进行编码。
CERT.SF是对之前的MANIFEST.MF文件整个内容做一个SHA1放到SHA1-Digest-Manifest字段中。
再对MANIFEST.MF中的每个条目内容进行一次SHA算法。
例如AndroidManifest.xml:
"Name: AndroidManifest.xml\r\nSHA1-Digest: Sov8xvSPp6Hy1XaO20ZtQTIxH7w=\r\n\r\n"
CERT.RSA是把CERT.SF文件用私钥计算签名,然后将签名和包含公钥信息的数字证书一同写入。
V1签名的缺点:签名校验比较慢,增加了安装时间;META-INF 文件不会计入校验过程,可能会带来一些安全隐患。
- V2签名:全文件签名方案
v2 签名模式在原先 APK 块中增加了一个新的签名块,签名块存储了签名,摘要,签名算法,证书链,额外属性等信息。
签名块所在位置实际是zip文件的EFS(存档额外数据记录)所在位置,zip未加密时EFS数据段不会被zip解析。
摘要计算:
将zip中的每个块按1M大小进行分割,计算每个块的数据摘要,再计算所有数据摘要的摘要。
- V3签名:
V3基于V2,在V2的基础上增加了秘钥轮替。新增Proof-of-rotation数据结构,包含一个单链表,按照签名证书版本排序。
- V4签名:
v4 基于 APK 所有的字节计算出 Merkle Hash 树,并将 Merkle 树的根 Hash、盐值作为签名数据进行包完整性校验,v4 签名必须单独存在 .idsig 文件中,不会存在于 APK 文件中,所以 apk 文件中仍然需要 v2 或者 v3 签名。