校验和将文件字节与参考值比对。签名将完整性与密钥关联。两者都不能单独证明软件安全。
安装 Android APK 之前,请区分三项检查:这个文件是否与预期版本一致?它是否由预期的密钥签名?独立构建者能否根据声明的源代码复现它? SHA-256 校验和、APK 签名和可复现构建分别从不同角度回答这些问题。
其中任何一项都不能单独判定软件是否为恶意软件。签名正确、构建可复现的程序,仍然可能包含安全漏洞或故意实施的有害行为。
各种验证方法能确认什么
| 检查方式 | 有用的结果 | 重要局限 |
|---|---|---|
| 文件的 SHA-256 摘要 | 文件字节与某个可信摘要匹配 | 攻击者若同时替换文件和摘要,就能绕过这项比对 |
| APK 签名验证 | 软件包的签名能够通过其签名证书的验证 | 必须确定预期的签名密钥;仅仅签名有效,并不能确认发布者身份 |
| 可复现构建比对 | 可以根据有文档记录的输入重新生成指定的构建产物 | 源代码与二进制文件相符,并不能证明源代码安全 |
| 安全审查 | 特定的设计或实现问题经过了评估 | 审查范围、版本、发现的问题以及尚未解决的问题都很重要 |
Android 要求 APK 经过签名才能安装和更新。使用 Play App Signing 时,Google 可以管理应用签名密钥,并根据应用包生成用于分发的 APK。这些是有文档说明的信任安排,并不能证明任意中间方都可以悄悄修改软件包而仍保留有效签名。参见 Android 应用签名指南。
第 1 步:确定要验证的具体构建产物
记录应用版本、发布渠道、文件名以及目标平台变体。请使用发布者的官方分发页面,不要使用与 APK 一同出现在同一条未经请求的消息中的校验和。
直接从发布者处下载的 APK,可能与应用商店为某台设备生成的 APK 不同。不同版本、架构、打包方式或签名安排,都可能合理地产生不同的文件哈希值。在把不匹配视为篡改证据之前,请先确保比较的是同一种构建产物。
实际需要问的是:预期值来自哪里?我为什么信任这个来源? 离线计算哈希,并不能解决对在线获取的摘要来源的信任问题。
第 2 步:在本地计算 SHA-256
将 messenger.apk 替换为你下载的文件名。下面的示例只读取文件,不会安装它。
Linux:
sha256sum messenger.apk
macOS:
shasum -a 256 messenger.apk
Windows 命令提示符:
certutil -hashfile messenger.apk SHA256
请比较完整的摘要,只忽略显示用的空格和字母大小写。不要仅比较开头或末尾的几个字符。将预期摘要及其发布版本信息保存在一起,以便重复进行比对。
如果数值不同,请在安装前停下来。核对构建产物和版本,适当时从可信来源重新下载,并向发布者询问无法解释的不匹配。不要为了匹配手头收到的文件,而去“修正”预期的校验和。
第 3 步:检查 APK 签名
对于安装了 Android SDK Build Tools 的用户,Google 的 apksigner 文档说明了如何验证签名并输出证书信息:
apksigner verify --verbose --print-certs messenger.apk
对于该 APK 支持的平台,签名验证应当成功。将其签名者证书信息与可信的发布记录,或发布者文档中记录的签名密钥沿革进行比较。使用陌生密钥生成的签名,不会因为显示“已验证”就变得可信。合法的签名密钥轮换也需要证据,而不是一句让你忽略不匹配的指示。
APK 文件的 SHA-256 摘要与其签名证书的 SHA-256 指纹是两个不同的值。不要把两者互相比对。
第 4 步:寻找可复现构建的证据
可复现构建的声明需要明确源代码修订版本、构建环境、操作说明和目标构建产物。独立第三方应能重新生成该产物,并比较结果。Reproducible Builds 项目的定义将这些输入条件列为此类声明的组成部分。
对于即时通讯软件,有用的发布证据包括源代码标签、固定的依赖项和工具链版本、构建说明,以及独立比对的结果。要问清楚究竟比较了什么:未签名的构建产物、已签名的 APK,还是软件包中的部分内容。不要仅仅因为发布了源代码和下载文件的哈希值,就推断构建是可复现的。
可复现性能够加强经过审查的源代码与分发代码之间的对应关系。但它不会把未经审查的实现变成安全的协议,也不能证明正在运行的手机没有遭到入侵。
Livara 的 Proof Lab 能发挥什么作用
Livara 的 Proof Lab提供本地 APK 哈希计算,并与其公布的摘要进行比对。其密码学演示的范围比完整即时通讯协议的安全审计更窄。请结合预期版本和签名信息,按照哈希检查所声明的用途使用它;不要将它视为可复现构建或不存在后门的独立证明。
威胁模型明确指出:如果 APK 及其显示的摘要都能被替换,这项检查就存在局限。因此,参考值的来源与正确完成计算同样重要。
常见问题
校验和一致是否证明 APK 安全?
不能。在参考值可信、哈希函数的安全性质成立的前提下,它只能确认文件与参考摘要匹配。它不会评估程序的行为。
如果校验和一致,签名验证是否多此一举?
不是。这两项检查提供的是不同的证据。签名将软件包完整性与某个密钥关联起来;文件摘要则标识某个特定的字节序列。
从应用商店下载的文件必须与网站 APK 的哈希值一致吗?
只有在两者本应是同一个构建产物时才必须一致。先检查发布渠道、版本和打包方式。无法解释的不匹配值得调查,但既不应直接据此指控,也不应自动放行。
这些检查能检测手机上已经存在的间谍软件吗?
不能。它们评估的是安装用的构建产物,而不是设备当前运行状态中的每一个组成部分。



