安卓应用签名和签名验证


应用签名

应用签名是一个过程中,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的FilesPlay services就有多个签名。

如何识别正确的签名:

  1. AndroidFreeware拥有一个复杂的APK检查器,可执行安卓权限检查,检测危险标记与过滤器,计算md5, sha1, sha256校验和,以及执行VirusTotal杀毒检查。
  2. 使用像My APK的工具查看应用签名。
  3. 使用试验方法。安装不同的APKs直到更新有效,然后记住正确的签名进行未来的更新。
  4. 使用APKMirror上的ML Manager上传应用以找到现有的签名。
  5. 有些桌面工具可以找到APK文件的签名。其中包括Google的apksigner,IBM的keytool,和Warren Bank的print-apk-signature

目录