安卓应用签名和签名验证
应用签名
应用签名是一个过程中,APK (Android Package) 被使用私钥签名,该密钥唯一标识应用开发者。这个过程确保了应用确实来自声称的开发者,并在签名之后未被篡改。以下是详细分解:
生成密钥库
- 开发者创建一个密钥库,这是一个包含加密密钥的二进制文件。该密钥库包含一个用于签名APK的私钥。
- 密钥库受密码保护,应妥善保管以防止未经授权的访问。
签名APK
- 在构建过程的期间或之后,APK会使用存储在密钥库中的私钥进行签名。
- 该过程生成一个通过哈希函数生成的数字签名,即APK内容的唯一摘要。
- 然后,使用开发者的私钥对摘要进行加密,并将结果存储在APK中。
证书包含
- APK中包含的证书含有用于签名的私钥对应的公钥。
- 该证书用于安装过程中验证数字签名。
为什么应用签名很重要?
- 确保真实性: 确认应用开发者的身份。
- 保护完整性: 确保应用自签名以来未被篡改。
- 保证安全更新: 确保更新来自原始开发者,因为更新必须用同一个密钥进行签名。
签名验证
签名验证是安卓操作系统在安装前检查APK数字签名以确保其完整性和真实性的过程。查看这个Reddit帖子关于如何轻松验证APK的签名/真实性,然后回来阅读验证如何工作:
提取证书
当一个APK下载并开始安装时,设备会从APK中提取包含公钥的证书。
解密签名
- 设备使用从证书提取的公钥解密嵌入在APK中的数字签名。
- 解密后得到在签名过程中生成的原始哈希(摘要)。
生成哈希
设备独立生成APK内容的哈希。它使用了签名过程中使用的相同哈希函数。
比较哈希
- 设备将独立生成的哈希与数字签名中的解密哈希进行比较。
- 匹配: 如果匹配,则证实该APK为真实且未被篡改,允许继续安装。
- 不匹配: 如果不匹配,则表明APK可能在签名后被更改,安装将被阻止。
为什么签名验证很重要?
- 验证真实性: 确保APK由所述开发者签名。
- 维持完整性: 确认APK自签名以来未被修改。
- 保护用户: 阻止可能是恶意的APK的安装。
如果应用有多个签名,我应该选择哪个签名?
大多数应用只有一个有效的签名,但有些可能有多个。你需要将APK的签名与设备上已安装的应用签名匹配,以避免更新错误。
多签名的原因
- 密钥轮换: 安卓9允许开发者切换签名密钥。这是因为APK签名方案v3。
- 分销渠道: 来自不同来源(例如,Play Store, Github)的应用可能有不同的签名。
- 系统应用: 系统应用的签名密钥可能因设备或操作系统版本而异。
- 其他未说明情况: 一些应用如Google的Files和Play services就有多个签名。
如何识别正确的签名:
- AndroidFreeware拥有一个复杂的APK检查器,可执行安卓权限检查,检测危险标记与过滤器,计算md5, sha1, sha256校验和,以及执行VirusTotal杀毒检查。
- 使用像My APK的工具查看应用签名。
- 使用试验方法。安装不同的APKs直到更新有效,然后记住正确的签名进行未来的更新。
- 使用APKMirror上的ML Manager上传应用以找到现有的签名。
- 有些桌面工具可以找到APK文件的签名。其中包括Google的apksigner,IBM的keytool,和Warren Bank的print-apk-signature。