目录一、什么是 APK1. 基本定义2. APK 内部核心结构解压可见3. 关键特性二、APK 签名是什么、为什么要签名1. 签名的本质核心两个加密概念先搞懂2. 安卓为什么强制要求签名三、APK 签名文件详解META-INF 目录逐个解析签名生成顺序MANIFEST.MF → CERT.SF → CERT.RSA1. MANIFEST.MF清单文件2. CERT.SF签名文件3. CERT.RSA证书 签名文件最重要四、安卓 APK 签名类型4 大类1. 调试签名Debug 签名2. 发布签名Release 正式签名 / 自有签名3. 平台签名Platform 签名4. 系统签名Test-Key / 根签名五、主流签名方案V1 签名、V2 签名、V3 签名、V4 签名1. V1 签名传统签名Android 1.0 支持2. V2 签名APK 块签名Android 7.0 / API 243. V3 签名Android 9.0 / API 284. V4 签名Android 11.0 / API 30六、完整签名流程手动 工具原理1. 前置生成签名密钥库keystore2. 对未签名 APK 执行签名apksigner 工具谷歌官方3. 签名底层逻辑一句话梳理七、APK 签名校验系统安装 / 运行时校验流程1. 安装时校验核心环节最严格步骤 1优先校验 V2/V3高版本系统步骤 2降级校验 V1 签名兼容旧机型步骤 3比对包名 历史签名升级校验2. 运行时校验八、应用内代码主动校验签名防篡改 / 二次打包核心思路九、常见问题 面试 / 实战考点1. 改了 APK 资源 / 代码为什么安装失败2. 同包名不同签名会怎样3. 调试签名和正式签名能混用升级吗4. 签名密钥keystore丢了怎么办5. V1 和 V2 签名区别6. 什么是二次打包十、快速总结本文从基础概念、签名原理、签名流程、校验逻辑、实战场景、常见问题逐层讲解兼顾理论 安卓系统底层规则适合开发、逆向、测试、运维参考。一、什么是 APK1. 基本定义APKAndroid Application Package安卓系统的应用安装包本质是一个ZIP 压缩包后缀.apk。2. APK 内部核心结构解压可见├── classes.dex # 安卓可执行字节码Java/Kotlin 编译产物 ├── resources.arsc # 资源索引表 ├── res/ # 图片、布局、字符串等资源 ├── AndroidManifest.xml # 应用清单包名、权限、组件、版本、签名信息入口 ├── META-INF/ # 【签名核心目录】签名文件全部存在这里3. 关键特性安卓系统只认可合法签名的 APK未签名 / 签名非法无法安装 / 运行。同包名 不同签名 系统判定为两个完全不同应用无法覆盖安装。同包名 相同签名 可覆盖升级、共享数据、权限互通。二、APK 签名是什么、为什么要签名1. 签名的本质APK 签名 非对称加密 摘要校验目的是给 APK 做身份认证 防篡改。核心两个加密概念先搞懂消息摘要Hash对文件内容做哈希MD5/SHA1/SHA256文件哪怕改 1 个字节摘要完全变化用于防篡改。非对称加密公钥 / 私钥私钥密钥开发者本地保管绝对不能泄露用来生成签名。公钥嵌入 APK 中公开可见系统用公钥验证签名合法性。2. 安卓为什么强制要求签名安卓官方强制所有 APK 必须签名三大核心作用身份溯源证明 APK 来自合法开发者不是第三方伪造。防篡改APK 被篡改改代码、改资源、加广告、植入病毒后签名直接失效。应用权限与升级管控覆盖安装仅包名一致 签名一致才允许升级。共享 UID / 数据同签名应用可互通数据、跨组件调用。系统权限部分高危权限只对系统签名 / 平台签名应用开放。补充Android 从 4.0 开始禁止无签名 APK 安装。三、APK 签名文件详解META-INF 目录签名文件全部存放在 APK 根目录META-INF下标准 3 个文件META-INF/ ├── MANIFEST.MF # 1. 全局文件摘要清单所有文件的 Hash ├── CERT.SF # 2. 对 MANIFEST.MF 做摘要 签名摘要 ├── CERT.RSA # 3. 公钥、证书、签名结果核心校验文件逐个解析签名生成顺序MANIFEST.MF → CERT.SF → CERT.RSA1. MANIFEST.MF清单文件对 APK除 META-INF 外的所有文件逐一计算SHA 哈希值格式Name: classes.dex SHA-256-Digest: xxxxxxxxxxxxxxxxxxxxx Name: res/drawable/icon.png SHA-256-Digest: yyyyyyyyyyyyyyyyy作用记录整个包内所有文件的原始摘要第一步防篡改。2. CERT.SF签名文件对MANIFEST.MF 的每一段内容再次计算哈希并记录。目的防止攻击者篡改MANIFEST.MF后重新伪造摘要。层级第二层校验加固防篡改。3. CERT.RSA证书 签名文件最重要由两部分组成开发者证书含公钥包含开发者信息、公钥、证书有效期、签发机构。数字签名使用开发者私钥对CERT.SF整体加密得到的签名值。改名说明CERT是默认名称可自定义如TEST.RSA后缀固定.RSA/.DSA。四、安卓 APK 签名类型4 大类安卓按使用场景、权限等级分为 4 种签名权限从低到高1. 调试签名Debug 签名用途开发阶段日常调试Android Studio 自动生成。特点密钥固定、公开所有人的 AS 调试签名基本一致。不能上架应用商店仅用于本地测试。路径~/.android/debug.keystore限制无法用于正式包、无法享受厂商特权。2. 发布签名Release 正式签名 / 自有签名用途商业应用上架、对外分发开发者自己生成密钥库keystore。特点私钥由开发者独自保管一旦丢失无法找回应用无法升级。应用商店主流要求华为、小米、应用宝、Google Play 均使用此类。普通第三方应用最高权限无法调用系统底层特权。3. 平台签名Platform 签名用途安卓系统原生应用、系统预装 APP如短信、设置、电话。特点使用安卓系统源码内置的平台密钥签名。拥有系统级权限可申请system级别权限、访问底层接口。普通开发者无法获取官方平台密钥仅 ROM 定制厂商使用。4. 系统签名Test-Key / 根签名用途ROM 固件、底层系统组件权限最高。特点整机最高权限可修改系统配置、挂载分区、操控硬件。五、主流签名方案V1 签名、V2 签名、V3 签名、V4 签名Android 先后推出 4 套签名方案互不兼容但可共存现在主流是V1V2 双签名。1. V1 签名传统签名Android 1.0 支持就是上面讲的META-INF三文件签名方式MANIFEST.MF .SF .RSA优点兼容性极强所有安卓版本都能识别。缺点只校验文件内容不校验APK 整个分区结构。支持zipalign对齐、二次修改资源逆向篡改常用漏洞。篡改后有可能绕过校验。2. V2 签名APK 块签名Android 7.0 / API 24全称APK Signature Scheme v2谷歌为修复 V1 漏洞推出。原理不再针对单个文件签名而是把整个 APK 当作一个整体块做哈希和签名。核心特性校验整个 APK 二进制流任何位置修改都会直接校验失败。篡改难度大幅提升彻底封堵 V1 篡改漏洞。安装校验速度更快。现状目前工业界标配国内应用商店强制要求开启 V2。3. V3 签名Android 9.0 / API 28核心解决密钥轮换问题场景企业密钥泄露、人员离职、旧密钥丢失需要更换签名密钥但保留应用升级链路。能力支持旧密钥 → 新密钥 平滑迁移新旧签名均可正常升级。用法一般和 V1/V2 组合使用。4. V4 签名Android 11.0 / API 30专为流式安装、云应用、ADB 快速安装设计不嵌入签名到 APK 内部签名单独存为外部文件。主要用于谷歌生态、云手机、大体积应用分块安装国内普通 APP 极少使用。总结推荐配置 国内上架包 →V1 V2 同时开启兼容旧机型 安全防篡改 海外 / 需密钥轮换 → V1V2V3六、完整签名流程手动 工具原理以Release 正式签名V1V2为例分两步生成密钥库→对 APK 签名1. 前置生成签名密钥库keystore安卓签名使用JKS / PKCS12密钥库文件后缀.keystore/.jks使用 JDK 自带keytool工具。命令示例keytool -genkey -alias 别名 -keyalg RSA -keysize 2048 -keystore 你的签名.jks交互项密码、姓名、组织、城市等证书信息。关键概念keystore密钥库文件存放一对公钥 私钥。alias密钥别名一个密钥库可存多组密钥。两个密码密钥库密码、密钥条目密码可设为相同。2. 对未签名 APK 执行签名apksigner 工具谷歌官方安卓推荐使用apksignerAndroid SDK 自带支持 V1/V2/V3。apksigner sign --ks 你的签名.jks --ks-key-alias 别名 未签名.apk执行后生成已签名 APK。3. 签名底层逻辑一句话梳理遍历 APK 所有文件生成文件摘要 → 写入MANIFEST.MF对MANIFEST.MF生成摘要 → 写入CERT.SF用开发者私钥加密CERT.SF生成签名 → 写入CERT.RSA附加公钥、开发者证书到CERT.RSAV2 额外对整个 APK 二进制做整体哈希 签名。七、APK 签名校验系统安装 / 运行时校验流程这是安卓系统底层执行逻辑分安装校验和运行校验两部分。1. 安装时校验核心环节最严格用户安装 APK 时PackageManagerServicePMS执行完整校验顺序如下步骤 1优先校验 V2/V3高版本系统Android 7.0 先检测是否有 V2 签名读取 APK 整体签名块 公钥。用公钥解密签名得到原始哈希值。重新计算当前整个 APK 的哈希对比是否一致。不一致 → 直接提示“安装包已损坏”终止安装。一致 → 进入下一步。步骤 2降级校验 V1 签名兼容旧机型系统再校验传统 V1 三文件读取CERT.RSA取出公钥和签名。用公钥解密签名还原出CERT.SF的原始哈希。本地重新计算当前CERT.SF哈希对比。逐行校验CERT.SF和MANIFEST.MF。逐文件校验 APK 内所有文件的哈希。任意一步校验失败安装失败提示安装包损坏签名不一致解析错误步骤 3比对包名 历史签名升级校验如果是覆盖安装读取手机上已安装应用的历史签名公钥。和新 APK 的公钥对比相同 → 允许覆盖升级。不同 → 提示“应用签名不一致无法安装”。2. 运行时校验部分高安全机型 / 系统会在 APP 启动时二次校验签名读取当前 APP 签名证书。应用内代码也可主动校验自身签名防二次打包、破解。八、应用内代码主动校验签名防篡改 / 二次打包开发者可以在 APP 代码里主动获取签名做本地校验加固安全。核心思路代码中获取当前 APP 的签名证书公钥 / 哈希值。和开发者预置的合法签名哈希对比。不一致 → 判断为被篡改 / 二次打包直接退出应用。常用方案校验签名 SHA1 / SHA256 指纹最常用。校验证书序列号、证书主体信息。逆向场景攻击者篡改 APK 后签名一定会变该校验能有效拦截简单二次打包。九、常见问题 面试 / 实战考点1. 改了 APK 资源 / 代码为什么安装失败修改文件 → 文件哈希变化 → V1/V2 签名校验不通过 → 安装包损坏。2. 同包名不同签名会怎样无法覆盖安装。系统视为两个独立 APP可共存。数据、权限完全隔离。3. 调试签名和正式签名能混用升级吗不能两者公钥不同升级报错。4. 签名密钥keystore丢了怎么办已上架应用无法继续升级包名 签名必须一致。解决方案换包名重新上架或使用 Android V3 签名做密钥轮换需提前配置。5. V1 和 V2 签名区别V1文件级签名兼容全版本有篡改漏洞。V2APK 整体块签名安全性高7.0 支持。6. 什么是二次打包攻击者解包 APK → 植入广告 / 病毒 →重新签名→ 分发。 防御开启 V2 签名 应用内代码校验签名。十、快速总结APK 安卓安装包本质 ZIP 压缩包META-INF存放签名。APK 签名 非对称加密 哈希摘要作用身份认证、防篡改、版本管控。签名文件MANIFEST.MF(文件摘要) →.SF(摘要签名) →.RSA(公钥 最终签名)。签名方案V1 (兼容)、V2 (整体安全主流)、V3 (密钥轮换)、V4 (流式安装)。签名校验系统安装时逐层校验哈希 公钥解密签名不一致 / 篡改直接拦截。核心铁律包名 签名 应用唯一身份。
APK、APK 签名、签名校验 完整详解
目录一、什么是 APK1. 基本定义2. APK 内部核心结构解压可见3. 关键特性二、APK 签名是什么、为什么要签名1. 签名的本质核心两个加密概念先搞懂2. 安卓为什么强制要求签名三、APK 签名文件详解META-INF 目录逐个解析签名生成顺序MANIFEST.MF → CERT.SF → CERT.RSA1. MANIFEST.MF清单文件2. CERT.SF签名文件3. CERT.RSA证书 签名文件最重要四、安卓 APK 签名类型4 大类1. 调试签名Debug 签名2. 发布签名Release 正式签名 / 自有签名3. 平台签名Platform 签名4. 系统签名Test-Key / 根签名五、主流签名方案V1 签名、V2 签名、V3 签名、V4 签名1. V1 签名传统签名Android 1.0 支持2. V2 签名APK 块签名Android 7.0 / API 243. V3 签名Android 9.0 / API 284. V4 签名Android 11.0 / API 30六、完整签名流程手动 工具原理1. 前置生成签名密钥库keystore2. 对未签名 APK 执行签名apksigner 工具谷歌官方3. 签名底层逻辑一句话梳理七、APK 签名校验系统安装 / 运行时校验流程1. 安装时校验核心环节最严格步骤 1优先校验 V2/V3高版本系统步骤 2降级校验 V1 签名兼容旧机型步骤 3比对包名 历史签名升级校验2. 运行时校验八、应用内代码主动校验签名防篡改 / 二次打包核心思路九、常见问题 面试 / 实战考点1. 改了 APK 资源 / 代码为什么安装失败2. 同包名不同签名会怎样3. 调试签名和正式签名能混用升级吗4. 签名密钥keystore丢了怎么办5. V1 和 V2 签名区别6. 什么是二次打包十、快速总结本文从基础概念、签名原理、签名流程、校验逻辑、实战场景、常见问题逐层讲解兼顾理论 安卓系统底层规则适合开发、逆向、测试、运维参考。一、什么是 APK1. 基本定义APKAndroid Application Package安卓系统的应用安装包本质是一个ZIP 压缩包后缀.apk。2. APK 内部核心结构解压可见├── classes.dex # 安卓可执行字节码Java/Kotlin 编译产物 ├── resources.arsc # 资源索引表 ├── res/ # 图片、布局、字符串等资源 ├── AndroidManifest.xml # 应用清单包名、权限、组件、版本、签名信息入口 ├── META-INF/ # 【签名核心目录】签名文件全部存在这里3. 关键特性安卓系统只认可合法签名的 APK未签名 / 签名非法无法安装 / 运行。同包名 不同签名 系统判定为两个完全不同应用无法覆盖安装。同包名 相同签名 可覆盖升级、共享数据、权限互通。二、APK 签名是什么、为什么要签名1. 签名的本质APK 签名 非对称加密 摘要校验目的是给 APK 做身份认证 防篡改。核心两个加密概念先搞懂消息摘要Hash对文件内容做哈希MD5/SHA1/SHA256文件哪怕改 1 个字节摘要完全变化用于防篡改。非对称加密公钥 / 私钥私钥密钥开发者本地保管绝对不能泄露用来生成签名。公钥嵌入 APK 中公开可见系统用公钥验证签名合法性。2. 安卓为什么强制要求签名安卓官方强制所有 APK 必须签名三大核心作用身份溯源证明 APK 来自合法开发者不是第三方伪造。防篡改APK 被篡改改代码、改资源、加广告、植入病毒后签名直接失效。应用权限与升级管控覆盖安装仅包名一致 签名一致才允许升级。共享 UID / 数据同签名应用可互通数据、跨组件调用。系统权限部分高危权限只对系统签名 / 平台签名应用开放。补充Android 从 4.0 开始禁止无签名 APK 安装。三、APK 签名文件详解META-INF 目录签名文件全部存放在 APK 根目录META-INF下标准 3 个文件META-INF/ ├── MANIFEST.MF # 1. 全局文件摘要清单所有文件的 Hash ├── CERT.SF # 2. 对 MANIFEST.MF 做摘要 签名摘要 ├── CERT.RSA # 3. 公钥、证书、签名结果核心校验文件逐个解析签名生成顺序MANIFEST.MF → CERT.SF → CERT.RSA1. MANIFEST.MF清单文件对 APK除 META-INF 外的所有文件逐一计算SHA 哈希值格式Name: classes.dex SHA-256-Digest: xxxxxxxxxxxxxxxxxxxxx Name: res/drawable/icon.png SHA-256-Digest: yyyyyyyyyyyyyyyyy作用记录整个包内所有文件的原始摘要第一步防篡改。2. CERT.SF签名文件对MANIFEST.MF 的每一段内容再次计算哈希并记录。目的防止攻击者篡改MANIFEST.MF后重新伪造摘要。层级第二层校验加固防篡改。3. CERT.RSA证书 签名文件最重要由两部分组成开发者证书含公钥包含开发者信息、公钥、证书有效期、签发机构。数字签名使用开发者私钥对CERT.SF整体加密得到的签名值。改名说明CERT是默认名称可自定义如TEST.RSA后缀固定.RSA/.DSA。四、安卓 APK 签名类型4 大类安卓按使用场景、权限等级分为 4 种签名权限从低到高1. 调试签名Debug 签名用途开发阶段日常调试Android Studio 自动生成。特点密钥固定、公开所有人的 AS 调试签名基本一致。不能上架应用商店仅用于本地测试。路径~/.android/debug.keystore限制无法用于正式包、无法享受厂商特权。2. 发布签名Release 正式签名 / 自有签名用途商业应用上架、对外分发开发者自己生成密钥库keystore。特点私钥由开发者独自保管一旦丢失无法找回应用无法升级。应用商店主流要求华为、小米、应用宝、Google Play 均使用此类。普通第三方应用最高权限无法调用系统底层特权。3. 平台签名Platform 签名用途安卓系统原生应用、系统预装 APP如短信、设置、电话。特点使用安卓系统源码内置的平台密钥签名。拥有系统级权限可申请system级别权限、访问底层接口。普通开发者无法获取官方平台密钥仅 ROM 定制厂商使用。4. 系统签名Test-Key / 根签名用途ROM 固件、底层系统组件权限最高。特点整机最高权限可修改系统配置、挂载分区、操控硬件。五、主流签名方案V1 签名、V2 签名、V3 签名、V4 签名Android 先后推出 4 套签名方案互不兼容但可共存现在主流是V1V2 双签名。1. V1 签名传统签名Android 1.0 支持就是上面讲的META-INF三文件签名方式MANIFEST.MF .SF .RSA优点兼容性极强所有安卓版本都能识别。缺点只校验文件内容不校验APK 整个分区结构。支持zipalign对齐、二次修改资源逆向篡改常用漏洞。篡改后有可能绕过校验。2. V2 签名APK 块签名Android 7.0 / API 24全称APK Signature Scheme v2谷歌为修复 V1 漏洞推出。原理不再针对单个文件签名而是把整个 APK 当作一个整体块做哈希和签名。核心特性校验整个 APK 二进制流任何位置修改都会直接校验失败。篡改难度大幅提升彻底封堵 V1 篡改漏洞。安装校验速度更快。现状目前工业界标配国内应用商店强制要求开启 V2。3. V3 签名Android 9.0 / API 28核心解决密钥轮换问题场景企业密钥泄露、人员离职、旧密钥丢失需要更换签名密钥但保留应用升级链路。能力支持旧密钥 → 新密钥 平滑迁移新旧签名均可正常升级。用法一般和 V1/V2 组合使用。4. V4 签名Android 11.0 / API 30专为流式安装、云应用、ADB 快速安装设计不嵌入签名到 APK 内部签名单独存为外部文件。主要用于谷歌生态、云手机、大体积应用分块安装国内普通 APP 极少使用。总结推荐配置 国内上架包 →V1 V2 同时开启兼容旧机型 安全防篡改 海外 / 需密钥轮换 → V1V2V3六、完整签名流程手动 工具原理以Release 正式签名V1V2为例分两步生成密钥库→对 APK 签名1. 前置生成签名密钥库keystore安卓签名使用JKS / PKCS12密钥库文件后缀.keystore/.jks使用 JDK 自带keytool工具。命令示例keytool -genkey -alias 别名 -keyalg RSA -keysize 2048 -keystore 你的签名.jks交互项密码、姓名、组织、城市等证书信息。关键概念keystore密钥库文件存放一对公钥 私钥。alias密钥别名一个密钥库可存多组密钥。两个密码密钥库密码、密钥条目密码可设为相同。2. 对未签名 APK 执行签名apksigner 工具谷歌官方安卓推荐使用apksignerAndroid SDK 自带支持 V1/V2/V3。apksigner sign --ks 你的签名.jks --ks-key-alias 别名 未签名.apk执行后生成已签名 APK。3. 签名底层逻辑一句话梳理遍历 APK 所有文件生成文件摘要 → 写入MANIFEST.MF对MANIFEST.MF生成摘要 → 写入CERT.SF用开发者私钥加密CERT.SF生成签名 → 写入CERT.RSA附加公钥、开发者证书到CERT.RSAV2 额外对整个 APK 二进制做整体哈希 签名。七、APK 签名校验系统安装 / 运行时校验流程这是安卓系统底层执行逻辑分安装校验和运行校验两部分。1. 安装时校验核心环节最严格用户安装 APK 时PackageManagerServicePMS执行完整校验顺序如下步骤 1优先校验 V2/V3高版本系统Android 7.0 先检测是否有 V2 签名读取 APK 整体签名块 公钥。用公钥解密签名得到原始哈希值。重新计算当前整个 APK 的哈希对比是否一致。不一致 → 直接提示“安装包已损坏”终止安装。一致 → 进入下一步。步骤 2降级校验 V1 签名兼容旧机型系统再校验传统 V1 三文件读取CERT.RSA取出公钥和签名。用公钥解密签名还原出CERT.SF的原始哈希。本地重新计算当前CERT.SF哈希对比。逐行校验CERT.SF和MANIFEST.MF。逐文件校验 APK 内所有文件的哈希。任意一步校验失败安装失败提示安装包损坏签名不一致解析错误步骤 3比对包名 历史签名升级校验如果是覆盖安装读取手机上已安装应用的历史签名公钥。和新 APK 的公钥对比相同 → 允许覆盖升级。不同 → 提示“应用签名不一致无法安装”。2. 运行时校验部分高安全机型 / 系统会在 APP 启动时二次校验签名读取当前 APP 签名证书。应用内代码也可主动校验自身签名防二次打包、破解。八、应用内代码主动校验签名防篡改 / 二次打包开发者可以在 APP 代码里主动获取签名做本地校验加固安全。核心思路代码中获取当前 APP 的签名证书公钥 / 哈希值。和开发者预置的合法签名哈希对比。不一致 → 判断为被篡改 / 二次打包直接退出应用。常用方案校验签名 SHA1 / SHA256 指纹最常用。校验证书序列号、证书主体信息。逆向场景攻击者篡改 APK 后签名一定会变该校验能有效拦截简单二次打包。九、常见问题 面试 / 实战考点1. 改了 APK 资源 / 代码为什么安装失败修改文件 → 文件哈希变化 → V1/V2 签名校验不通过 → 安装包损坏。2. 同包名不同签名会怎样无法覆盖安装。系统视为两个独立 APP可共存。数据、权限完全隔离。3. 调试签名和正式签名能混用升级吗不能两者公钥不同升级报错。4. 签名密钥keystore丢了怎么办已上架应用无法继续升级包名 签名必须一致。解决方案换包名重新上架或使用 Android V3 签名做密钥轮换需提前配置。5. V1 和 V2 签名区别V1文件级签名兼容全版本有篡改漏洞。V2APK 整体块签名安全性高7.0 支持。6. 什么是二次打包攻击者解包 APK → 植入广告 / 病毒 →重新签名→ 分发。 防御开启 V2 签名 应用内代码校验签名。十、快速总结APK 安卓安装包本质 ZIP 压缩包META-INF存放签名。APK 签名 非对称加密 哈希摘要作用身份认证、防篡改、版本管控。签名文件MANIFEST.MF(文件摘要) →.SF(摘要签名) →.RSA(公钥 最终签名)。签名方案V1 (兼容)、V2 (整体安全主流)、V3 (密钥轮换)、V4 (流式安装)。签名校验系统安装时逐层校验哈希 公钥解密签名不一致 / 篡改直接拦截。核心铁律包名 签名 应用唯一身份。