Ente Photos Android APK 签名验证指南:核对官方证书指纹与 apksigner 使用详解
【免费下载链接】ente💚 End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente
导读:从 GitHub Releases 直接下载的 Ente Photos Android APK,可以通过核对 APK 内置的签名证书指纹来确认其完整性、防止下载到被篡改或冒名的安装包。本文以官方文档
docs/docs/photos/getting-started/android-apk-signature.md为主体,结合仓库中 Android 构建脚本的签名配置,完整讲解 SHA1 / SHA256 指纹、apksigner验证流程、输出格式差异,以及不同分发渠道(GitHub 直装、Play Store、F-Droid)签名不一致的原因。
为什么要验证 APK 签名
如果你从 Ente Photos 的 GitHub Releases 直接下载 APK 并侧载安装,那么 APK 是通过网络传输的文件,无法 100% 排除传输过程中被中间人替换或镜像站点篡改的可能。Android 的 APK 签名机制恰好提供了校验手段:
- 每个正式发布的 APK 都使用 Ente 私钥进行签名,公钥对应的证书指纹是公开的;
- 用
apksigner读取 APK 实际携带的签名证书指纹,与官方公布的指纹逐一比对; - 若两者一致,即可确认该 APK 是由 Ente 官方密钥签发的原始构建产物,没有被二次打包或替换。
Ente Photos 官方签名证书指纹
以下指纹适用于从 GitHub Releases 直接下载的 APK(即直装版,对应independent构建 flavor):
| 算法 | 证书指纹 |
|---|---|
| SHA1 | E1:60:10:18:B6:B0:2E:A3:74:6F:90:67:50:30:29:75:0E:EF:6D:39 |
| SHA256 | 35:ED:56:81:B7:0B:B3:BD:35:D9:0D:85:6A:F5:69:4C:50:4D:EF:46:AA:D8:3F:77:7B:1C:67:5C:F4:51:35:0B |
注意:这两组指纹只对 GitHub 直装的 APK 有效。Play Store 和 F-Droid 渠道的包可能使用不同的签名密钥(详见下文"不同分发渠道的签名差异"一节),不能拿这两组指纹去核对商店下载的安装包。
使用 apksigner 验证 APK
apksigner是 Android SDK Build Tools 自带的签名校验工具,Android Studio 用户可直接在 SDK 目录下找到,也可以在 PATH 中直接调用。在装有 APK 文件的目录下执行:
apksigner verify --print-certs <path_to_apk>将<path_to_apk>替换为实际下载的 APK 文件路径,例如:
apksigner verify --print-certs ente-photos-v1.x.x.apk命令会输出该 APK 各签名者的证书信息,包括 SHA-1 与 SHA-256 摘要。将输出中的SHA1或SHA256值与上文指纹表逐项比对,完全一致即为官方签发的 APK。
输出格式的差异说明
官方文档特别提醒:apksigner打印证书指纹时使用小写字母且不带冒号,而官方公布指纹时使用大写字母和冒号分隔。因此对比时需要先做归一化,例如工具实际输出为:
Signer #1 certificate SHA-256 digest: 35ed5681b70bb3bd35d90d856af5694c504def46aad83f777b1c675cf451350b将其转换为大写并每两位用冒号分隔后,得到:
35:ED:56:81:B7:0B:B3:BD:35:D9:0D:85:6A:F5:69:4C:50:4D:EF:46:AA:D8:3F:77:7B:1C:67:5C:F4:51:35:0B与上表 SHA256 指纹完全一致。比对 SHA1 时同理:工具输出的小写无分隔符字符串应先做大小写与分隔符归一化,避免因格式差异误判。
不同分发渠道的签名差异
官方文档明确指出:"These fingerprints are for the direct APK download. Play Store and F-Droid packages may use different signing keys."
这一设计与仓库源码中的构建配置相互印证。查看 mobile/apps/photos/android/app/build.gradle,Android 构建定义了多个productFlavors:
| Flavor | applicationId 后缀 | 用途 |
|---|---|---|
independent | .independent(io.ente.photos.independent) | GitHub 直装版 / Obtainium 更新 |
dev | .dev | 开发调试 |
playstore | 无后缀(io.ente.photos) | Google Play 分发 |
fdroid | .fdroid(io.ente.photos.fdroid) | F-Droid 分发 |
不同渠道往往使用各自的发布密钥完成最终签名(例如 F-Droid 构建体系可以基于源码自行构建并用自己的密钥重签),因此同一份源码产出的安装包,在不同渠道的证书指纹可能并不相同。这正是官方文档强调指纹"仅适用于 GitHub 直装 APK"的原因。多渠道安装指引可参阅 docs/docs/photos/getting-started/installation.md,其中列出了 Play Store、F-Droid、GitHub Releases 与 Obtainium 四种 Android 安装方式。
源码中的签名配置(背景知识)
了解签名如何产生,有助于理解验证的意义。在 mobile/apps/photos/android/app/build.gradle 中,构建脚本会优先读取仓库android/key.properties文件中的storeFile、keyAlias、keyPassword、storePassword四个属性;若该文件不存在,则回退到环境变量SIGNING_KEY_PATH、SIGNING_KEY_ALIAS、SIGNING_KEY_PASSWORD、SIGNING_STORE_PASSWORD(见 build.gradle 的signingConfigs.release)。release构建类型通过signingConfig signingConfigs.release(build.gradle)应用该签名配置。
相应地,mobile/apps/photos/README.md 说明了自建签名 APK 的方法:先配置好 keystore,再执行
flutter build apk --release --flavor independent需要强调的是:自行构建并用自己的 keystore 签名得到的 APK,其证书指纹必然与官方公布的指纹不同,因为签名密钥不同。因此:
- 指纹比对只适用于官方渠道分发的 APK(尤其是 GitHub 直装版);
- 如果你从源码自行构建,应以"源码完整、依赖锁定、构建过程可信"为前提,而不是用官方指纹去核对自建包。
验证流程小结
- 从 GitHub Releases 下载 APK(对应
independentflavor 的直装版); - 执行
apksigner verify --print-certs <path_to_apk>读取签名证书; - 将输出的 SHA-256(或 SHA-1)摘要转大写并补上冒号分隔符;
- 与本文指纹表逐字符比对,完全一致即确认该 APK 由 Ente 官方密钥签名,可安全安装;
- 若指纹不一致,请勿安装,应重新从官方渠道下载并再次验证。
按照上述步骤,即可在侧载安装 Ente Photos 之前,以密码学可验证的方式确认安装包的真实性与完整性。
【免费下载链接】ente💚 End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考