APK 签名是什么?如何判断安装包是否被篡改

APK 为什么必须签名?本文讲清证书、签名方案和更新校验,并提供 apksigner、SHA-256 与证书指纹核验方法。

APKBang 编辑部25 次阅读
APK 数字签名、证书指纹与篡改检测示意图
文章目录 10 项

Android 要求可安装的 APK 经过数字签名。签名不仅用于证明“这个版本由持有某把私钥的人发布”,还让系统验证文件完整性,并决定一个新 APK 能否覆盖已有应用。

但要先纠正一个常见误区:签名验证通过,只能说明 APK 自签名后未被修改,不自动代表签名者就是你信任的官方开发者。 判断 APK 是否可信,必须把它的证书指纹与已知官方版本或可信来源进行对比。

APK 签名是什么?

开发者生成一对密码学密钥:私钥由开发者保管,用于给应用签名;公钥信息放在签名证书中,随 APK 一起分发。安装时,Android 使用证书中的公钥验证签名和内容摘要。

数字签名主要解决三个问题:

  1. 完整性:签名后 APK 的受保护内容是否被改动;
  2. 更新身份连续性:新版是否由与旧版相同或被认可的签名者发布;
  3. 应用关系:系统可根据签名授予特定应用间的信任关系。

Android 官方说明,每个 APK 都必须使用应用签名密钥进行加密签名才能安装。系统在首次安装后会记住签名身份,更新时再进行匹配。

APK 签名能阻止什么?

签名后,如果有人替换代码、植入广告、删除资源或修改清单,文件摘要会变化。采用 APK Signature Scheme v2 及更高版本时,受保护区域的整体改动会使签名验证失败。

攻击者当然可以修改后用自己的私钥重新签名,但证书指纹会变。它通常无法直接覆盖官方应用,只能要求用户先卸载原版,或以另一个包名安装。这正是“签名不一致”警告非常重要的原因。

对比 APK 证书指纹判断官方包与被重新签名包
对比 APK 证书指纹判断官方包与被重新签名包

v1、v2、v3、v4 签名有什么区别?

方案核心特点主要用途
v1基于 JAR 签名,逐个保护 ZIP 条目兼容较老 Android 系统
v2整体文件签名,强化完整性并加快验证Android 7.0 起支持
v3在 v2 基础上支持签名密钥轮换等能力较新 Android 版本
v4生成独立的增量安装签名数据配合增量安装,不能单独替代 v2/v3

一个 APK 可以同时包含多种签名方案,以兼顾旧系统和新系统。不要只看到“v1: true”就断定安全,也不要认为方案数字越大就等于来源越可靠。

签名有效,不等于来源可信

任何人都能生成一把密钥,并给自己制作的 APK 签名。因此需要区分两项检查:

  • 完整性验证:签名结构和内容摘要是否有效;
  • 身份比对:签名证书是否与官方已知指纹一致。

前者回答“文件签名后有没有再被改”;后者才帮助回答“它是不是同一个开发者发布的”。

如何用 apksigner 验证 APK?

Android SDK Build Tools 提供 apksigner。在终端运行:

apksigner verify --verbose --print-certs app.apk

重点查看:

  • Verified 是否成功;
  • v1、v2、v3 等签名方案的验证结果;
  • Signer certificate SHA-256 digest;
  • Signer certificate DN、序列号等辅助信息。

如果命令返回验证失败,不要安装。若验证成功,继续将 SHA-256 证书摘要与可信官方样本对比。

只导出证书信息

apksigner verify --print-certs app.apk

复制证书 SHA-256 指纹时,要逐字符比较。冒号、大小写或显示格式可以不同,但十六进制内容必须一致。

如何判断下载的 APK 是否被篡改?

方法一:与已安装官方应用比较签名

如果手机里已有从官方商店安装的版本,可提取其 APK 或通过可靠工具读取签名证书,再与下载包的证书 SHA-256 对比。两者一致,能证明它们属于同一签名身份或合法轮换链;不一致时,不应尝试覆盖安装。

方法二:与开发者公布的证书指纹比较

部分开源项目会在官网、代码仓库或发布说明中公布签名指纹。应从独立的官方渠道获取指纹,而不是只相信 APK 下载页面同时展示的结果。

方法三:核对文件 SHA-256

macOS 或 Linux 可运行:

shasum -a 256 app.apk

Windows PowerShell 可运行:

Get-FileHash .\app.apk -Algorithm SHA256

文件哈希可确认你下载的文件是否与发布者给出的那个文件逐字节一致。但哈希不是签名:换一个版本、重新压缩或改变任何字节,哈希都会不同;它也不能独立证明发布者身份。

方法四:观察更新安装结果

Android 拒绝签名不匹配的覆盖更新,是一个有价值的保护信号。但“能够安装”不等于绝对安全:首次安装没有旧证书可比,攻击者重新签名的包仍可能作为新应用安装。

为什么 APK 会显示签名不一致?

常见原因包括:

  • 下载的是第三方修改版或重新签名版;
  • 旧应用来自另一个签名渠道;
  • 开发者更换密钥但没有有效签名轮换链;
  • 安装了调试版,随后尝试覆盖为正式版;
  • 不同厂商渠道对同一包名使用了不同签名。

不要为了绕过冲突就立即卸载旧应用。卸载可能清除本地数据,也会移除系统用于比较更新签名的现有应用。先备份数据并确认新包的真实来源。

多引擎扫描能代替签名检查吗?

不能。恶意软件扫描关注已知威胁、行为或特征;签名比对关注文件完整性和发布身份。两者解决不同问题,都可能出现局限。

更可靠的组合是:可信来源 + 证书指纹匹配 + 文件哈希匹配 + 合理权限 + 安全扫描。任何单项通过都不应被理解为绝对安全保证。

普通用户的安装前检查清单

  1. 优先从官方应用商店或开发者官网获取应用;
  2. 检查域名、包名、版本号和发布日期;
  3. 更新现有应用时核对证书 SHA-256 指纹;
  4. 有官方文件哈希时进行逐字节核对;
  5. 检查应用申请的敏感权限是否符合功能;
  6. 遇到签名冲突时停止安装并调查来源;
  7. 不要轻易安装要求关闭系统防护或先卸载官方版的文件。

常见问题(FAQ)

APK 没有签名可以安装吗?

正常 Android 安装流程要求 APK 具有可验证签名。开发调试包也有签名,只是通常使用调试密钥。

APK 签名验证通过就是官方正版吗?

不是。验证通过只证明签名结构和受保护内容一致。还要把证书指纹与官方可信版本比较,才能判断签名身份。

两个 APK 的 SHA-256 不同就是被篡改吗?

不一定。不同版本、不同架构或不同构建的文件哈希本来就不同。只有在发布者明确声明它们应该是同一文件时,哈希不同才说明文件不一致。

为什么修改 APK 后必须重新签名?

修改会破坏原有内容摘要,使原签名失效。重新签名能让文件通过自己的签名验证,但证书身份已改变,不能冒充原开发者的更新。

开发者真的可以更换签名密钥吗?

较新的 Android 签名方案支持受控的密钥轮换,但系统需要有效的签名继承关系。普通的“换一把钥匙重新签名”不能直接覆盖旧版。

总结

APK 签名是 Android 应用完整性和更新信任链的基础。判断安装包是否被篡改,至少要完成两步:先用 apksigner 验证签名有效性,再把证书 SHA-256 指纹与官方可信版本比较。文件 SHA-256、权限审查和安全扫描可以作为补充,但不能替代证书身份核验。

参考资料

相关文章

进入指南
APK 下载安全吗?识别假冒、篡改和恶意安装包的方法下载 APK 是否安全取决于来源、签名和权限。本文提供安装前核验清单,帮助识别假冒、重签名和恶意安装包。34 次阅读APK、APKS、APKM、XAPK 和 AAB 有什么区别?一篇讲清 Android 安装包APK、APKS、APKM、XAPK、AAB 到底是什么?本文用对比表和安装指南讲清 Android 安装包区别、正确安装方式、版本选择与安全注意事项。36 次阅读Universal、nodpi、xhdpi、xxhdpi 怎么选?APK 屏幕版本指南Universal、nodpi、xhdpi、xxhdpi 是什么意思?本文讲清 APK 通用包、屏幕密度和 CPU 架构的区别,并给出选择方法。33 次阅读APK、AAB 有什么区别?开发、发布与安装流程对比APK 与 AAB 有什么区别?本文从用途、安装方式、签名、体积、Split APK 和应用商店发布流程完整比较。28 次阅读arm64-v8a、armeabi-v7a、x86_64 怎么选?APK 版本选择指南下载 APK 时不知道 arm64-v8a、armeabi-v7a、x86_64 怎么选?本文讲清 Android ABI、CPU 架构、DPI、Android 版本与正确选择方法。24 次阅读