Safe Haven APK 签名校验工具,apksigner verify 指纹比对
为什么要验证 APK 签名
Safe Haven 自己在服务端做了签名锁定(Signing-Key Pinning)——首次扫描记录签名哈希、后续每次复扫都比对。但用户在安装前自己也可以验证一遍,特别是在以下场景:
- APK 不是从 Safe Haven 客户端里下载的(比如从第三方链接拿到的)
- 想确认 Safe Haven 官方客户端没被篡改
- 安装某个应用前想自己做一层检查
需要什么工具
Android SDK Build Tools 里的 apksigner 工具。安装 Android Studio 后 Build Tools 会自带,或者单独下载:
命令所在路径:
Android/Sdk/build-tools/{version}/apksigner
Windows 上通常是:
C:\Users\{user}\AppData\Local\Android\Sdk\build-tools\{version}\apksigner.bat
Linux / macOS 上:
$ANDROID_HOME/build-tools/{version}/apksigner
怎么验证一个 APK
apksigner verify --print-certs app.apk
这个命令会:
- 校验 APK 签名是否完整有效
- 打印证书链
- 打印 SHA-256 指纹
正常输出会显示:
Verified using scheme v2
Signer #1 certificate DN: CN=ColourSwift, OU=Development, O=ColourSwift Technologies
Signer #1 certificate SHA-256 digest: 9c67f4224888f60e093cf7eab9b194e6d4cd73bb11313638c47b17f0d5f34ec4
Signer #1 certificate source of truth for verify: YES
如果输出里出现 ERROR: APK Signature Scheme v2 not found 或 DOES NOT VERIFY,说明:
- APK 没有完整签名
- 签名被篡改了
- APK 有问题,不要安装
Safe Haven 官方客户端的签名指纹
Safe Haven 客户端(com.colourswift.safehaven)由 ColourSwift 官方签名,SHA-256 证书指纹:
9c67f4224888f60e093cf7eab9b194e6d4cd73bb11313638c47b17f0d5f34ec4
怎么比对
- 用
apksigner verify --print-certs打印你拿到的 APK 的指纹 - 和上面这个指纹逐字比对
- 完全一致 → 官方签名,可以放心安装
- 不一致 → 不是官方版本,来源存疑
签名哈希 vs APK 文件哈希
这两个容易搞混:
| 哈希类型 | 算的是什么 | 用途 |
|---|---|---|
| APK SHA-256 | 整个 APK 文件的哈希 | 判断文件有没有被篡改(哪怕改一个字节哈希就变) |
| 签名证书 SHA-256 | APK 签名用的证书的哈希 | 判断签名是否来自正确的签名者(同一个开发者的所有 APK 证书哈希都一样) |
Safe Haven 的签名锁定用的是签名证书哈希(后者),不是 APK 文件哈希。因为 APK 文件哈希每次版本更新必然变,但同一个开发者的证书哈希应该保持稳定。
apksigner 的 scheme
Android 有三种 APK 签名方案:
- v1(JAR 签名):兼容 Android 7.0 之前,但速度慢
- v2(APK 签名方案 v2):Android 7.0+,整包签名速度快
- v3(APK 签名方案 v3):Android 9+,支持密钥轮换
Safe Haven 客户端用的是 v2 scheme(Verified using scheme v2)。v1 签名在某些场景下可以被绕过,所以 v2 是主流安全方案。
其他验证方式
不想装 Android SDK 也能验证:
方法 A:GitHub Release 页面
从 GitHub Releases 下载的 APK,Release Notes 里可能会贴出 SHA-256 哈希(APK 文件哈希,不是签名哈希)。用 certutil -hashfile app.apk SHA256(Windows)或 shasum -a 256 app.apk(Linux/macOS)比对。
方法 B:Safe Haven 客户端内查看
在 Safe Haven 客户端里,每个应用详情页会展示当前记录的签名哈希和APK SHA-256。如果你已经装了这个应用,可以用第三方工具(比如 ApkInfo、Signature Verifier 等)查看本地安装版本的签名哈希,和客户端展示的比对。
签名校验防住了什么
签名防得住:
- 有人冒充开发者发布同名 APK(签名不同,安装时安卓会拒绝)
- 安全社区发现恶意版本后用正确签名重新发布(安卓系统级阻止覆盖)
签名防不住:
- 开发者自己用恶意签名发布新版(签名锁定期也会标记这个变化)
- APK 内部加了跟踪器但没换签名(需要扫描管线或反编译才能发现)
- 密钥丢失、证书过期后的合法轮换(签名锁定需要管理员手动更新哈希)