android的签名
❶ Android v1、v2、v3签名详解
了解 HTTPS 通信的同学都知道,在消息通信时,必须解决确保消息来源的真实性与消息完整性的问题。同理,在安装 APK 时,也需要验证 APK 来源的真实性,并确保 APK 未被第三方篡改。为此,Android 官方要求开发者进行签名,即对 APK 进行加密。签名涉及基本概念:消息摘要、数字签名和数字证书。
消息摘要(Message Digest)是将消息数据通过单向哈希函数生成固定长度的哈希值,通常用于验证数据完整性。SHA-256 是 SHA-1 的升级版,现在 Android 使用的默认算法为 SHA-256。
数字签名的作用包括:保证信息传输完整性、发送者身份认证与防止抵赖。它通过使用发送者的私钥加密消息摘要,接收者则用对应公钥解密并验证消息完整性。RSA 是常见数字签名方案,其流程为:使用私钥加密消息摘要生成签体,接收者用公钥解密并验证。
然而,数字签名仅确保消息完整性,不保证保密性,且在消息长度较大时效率较低。因此,它通常与快速摘要算法结合使用,构成有效的签名方案。
数字证书用于保护公钥安全可信,它包含公钥拥有者信息及公钥,遵循 X.509 标准。数字证书通过 CA 机构的签名确保其可信度。数字证书结合数字签名技术,用于确保公钥的完整性与认证性。
Android 的打包流程包括:资源文件打包、aidl 文件处理、Java 代码编译、类文件转换与 APK 打包等步骤。签名发生在倒数第二步,针对已存在的 APK 文件,使用开发者自定义的 keystore 签名。
Android 的应用签名方案经历了三代:v1(基于 JAR 签名)、v2(APK 签名方案,Android 7.0 引入)、v3(APK 签名方案升级版,Android 9.0 引入)。v1 到 v2 是颠覆性的升级,主要解决 JAR 签名方案的安全性问题。v3 为 v2 的升级版,结构上未做重大调整。
v1 到 v2 的升级引入了渠道签署问题,为不同渠道安装包提供区别。各大厂提供了开源签渠道方案,如 Walle(美团)和 VasDolly(腾讯)。签名工具有 jarsigner 和 apksigner,它们用于 APK 签名,使用 keystore 文件和 pk8、x509.pem 文件。
签名过程包括:选取签名后的 APK,解压后分析 MANIFEST.MF、CERT.SF、CERT.RSA 文件内容。MANIFEST.MF 文件记录 APK 内容摘要,CERT.SF 文件记录摘要的摘要,CERT.RSA 文件则记录签名信息。签名验证发生在安装过程中,涉及三个步骤。
APK 签名方案 v2(Android 7.0 引入)改进了 v1 的签名校验速度慢与可修改性问题。它全文件签名,验证所有字节,确保 APK 的完整性与保护性。v3(Android 9.0 引入)在 v2 的基础上新增新证书块,记录所有签名信息,支持签名的替换与升级。
总之,Android 签名机制通过消息摘要、数字签名与数字证书确保了消息与 APK 的完整性和安全性,同时引入了签名验证机制来保护用户免受篡改与欺骗。签名方案的升级逐渐改进了性能与安全性,确保了向下兼容性,为开发者提供了强大的安全框架。
❷ Android 端 V1/V2/V3 签名的原理
Android 安装包的签名方案有三个版本,即 V1、V2 和 V3。接下来,我们详细了解一下这些签名的原理。
V1 签名方案中,apk 是一个 zip 文件,解压缩后,可以看到 META-INFO 文件夹中有 MANIFEST.MF、CERT.SF、CERT.RSA 三个文件。这三个文件在签名时创建,在安装时用于验证签名。MANIFEST.MF 文件记录了 apk 中每个文件的摘要信息,防止文件被篡改。CERT.SF 文件记录了 MANIFEST.MF 文件的摘要以及每个数据块的摘要,以防止 MANIFEST.MF 被篡改。最后,CERT.RSA 文件包含了对 CERT.SF 文件的签名和开发者证书,用于验证 CERT.SF 文件未被篡改。
V1 的签名机制包括以下步骤:计算每个原始文件的 SHA-1 摘要并写入 MANIFEST.MF,计算整个 MANIFEST.MF 的摘要并写入 CERT.SF,计算 MANIFEST.MF 中每一块的摘要并写入 CERT.SF,计算整个 CERT.SF 的摘要并使用开发者私钥计算出摘要的签名,然后将签名和证书写入 CERT.RSA。
V1 签名的校验流程如下:取出 CERT.RSA 中的开发者证书,通过系统根证书验证证书可信度,用证书中的公钥解密 CERT.RSA 中的签名,计算 CERT.SF 的签名,对比两者的签名是否一致,然后用 CERT.SF 验证 MANIFEST.MF 是否被修改,最后用 MANIFEST.MF 中的数据验证每个文件是否被修改。
V1 签名能够防止篡改,但存在校验速度慢和完整性不足的问题。
V2 签名方案在 Android 7.0 后引入,解决了 V1 签名校验速度慢的问题,并扩展了完整性的校验至整个安装包。V2 签名时,在 zip 文件的“文件信息”和“中央目录”之间插入签名信息块,按照 1MB 为单位计算摘要。V2 签名的校验流程包括判断是否具有 V2 签名,如有 V2 签名,则不再验证 V1 签名。
V3 签名方案与 V2 的签名块格式相同,但签名信息存放在不同的数据块中,允许更改 APK 的签名。