【问题标题】:How does Android's app/signature verification work?Android 的应用程序/签名验证如何工作?
【发布时间】:2012-06-11 21:22:08
【问题描述】:

我想用两件事来作为这个问题的开头,这样我就可以缩小我的实际问题所在:

a) 我以前做过软件开发,但从来没有为 android 做过

b) 我熟悉 PKI 和加密、散列和数字签名等等等等

话虽如此,我无法找到有关 Android 验证应用创建者的地点和方式的更多信息。我听到了很多不同的信息,因此我正在尝试综合以更好地了解工作流程。

我知道每个应用程序开发人员都有自己的私钥/公钥对,他们通过对 APK 进行哈希处理(如果我没记错的话,大部分时间使用 SHA-1)来签署他们的应用程序,然后就可以了。您上传它并且(我相信)公钥进入 APK 内的 META INF 中。这点我明白了。

我的问题是,这与用户下载应用程序本身时有何关系。我知道电话会检查以确保应用程序已有效签名,并且签名还包含有关作者等的信息。但我也读到应用程序是自签名的,Google Play(或他们现在称之为 Market 的任何东西)没有实现 CA,并且没有身份验证?但我的问题是,那么,是什么阻止了人们以其他开发者的名义上传应用程序(众包除外)?

如果手机只检查有效签名,这是否意味着在上传应用时完成了唯一的身份验证方式?如果是这种情况,应用市场如何检查呢?这是通常的 - 使用文件中的私钥并验证签名吗?还是开发者必须向市场提供他们的私钥才能进行身份验证?

【问题讨论】:

  • 当您签署 apk 时,您必须提供私人密码。因此,为了让某人“作为其他人”发布应用程序,他们需要访问他们的密钥库/密钥文件和密码。并访问与市场相关联的 Google 帐户。
  • @Tim:我认为他在问:什么是防止其他人创建自己的密钥对和自签名证书,其中也写着“Fewmitz”。它是否以某种方式与某处的帐户相关联?

标签: android authentication encryption pki


【解决方案1】:

简而言之,Android 和 Google Play 本质上并不关心实际证书中的内容。 Google Play 确实会验证它,并检查它是否有效 30 年或更长时间,但他们并没有真正使用(至少目前,AFAIK)证书中的实际信息。您可以在 CN 中使用您自己的名称/公司名称,但没有人会验证这一点,用户根本不会看到此信息。 Android 所做的是:

  • 检查签名以确保 APK 未被篡改
  • 然后将歌唱证书作为二进制 blob 与当前安装的应用程序版本之一进行比较,以确保这两个版本已使用相同的密钥/证书(例如,通过同一个人/公司)
  • 如果您对两个或多个应用程序使用 sharedUid 或签名权限,它会执行相同的操作来强制执行权限。

因此,为了回答您的问题,有人可以轻松地创建带有您名字的证书,但 Android 和 Google Play 并不在乎。只要他们没有您的私钥,他们就无法生成与您的相同的应用程序签名,因此他们将无法用他们的应用程序覆盖/更新您的应用程序,或获得任何特殊权限.

【讨论】:

  • 那么,这是否意味着如果使用两个具有相同公钥-私钥对但不同主题名称的证书,它们都是有效的?基本上,当我用我的私钥签署我的应用程序时,我的主题名称等详细信息是否在任何地方都被考虑在内?
  • 它不关心实际的“细节”(证书 DN、序列号等),而只是将证书作为二进制 blob 进行比较。由于它们不同,您无法将最初使用 cert1 签名的应用更新为使用 cert2 签名的另一个应用。
  • 说“它不关心实际的'细节'(证书DN、序列号等)”,你的意思是这些细节从未被使用过吗?因为最终正如您自己所说的“将证书作为二进制 blob 进行比较” - 这意味着它会考虑证书详细信息。
  • 当然没有这个意思。想想memcmp()Arrays.equals()。这些是否考虑到证书详细信息?
  • 是的,好的。所以比较了证书,但从不使用细节(除了比较)对吗?谢谢:)
猜你喜欢
  • 2011-07-13
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多