Android的应用/签名验证如何运作?

Few*_*itz 8 authentication encryption android pki

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

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

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

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

我知道每个应用程序开发人员都会获得他们自己的私钥/公钥对,并且他们通过散列APK来签署他们的应用程序(如果我没有记错的话,大部分时间都使用SHA-1)并且你去了.你上传它(我相信)公钥在APK内的META INF中.我明白这一点.

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

如果手机只检查有效签名是否意味着在上传应用程序时完成了唯一的身份验证方式?如果是这样的话,应用市场如何检查呢?这是通常的 - 使用文件上的私钥并验证签名?或者开发人员是否必须向市场提供其私钥进行身份验证?

Nik*_*kov 10

简而言之,Android和Google Play基本上不关心实际证书中的内容.Google Play确实会对其进行验证,并检查它是否有效30年或更长时间,但它们并未真正使用(至少目前为止,AFAIK)证书中的实际信息.您可以在CN中使用自己的姓名/公司名称,但没有人会对此进行验证,用户根本不会看到此信息.Android的作用是:

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

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

  • 它不关心实际的"细节"(证书DN,序列号等),而只是将证书作为二进制blob进行比较.由于它们不同,因此您无法使用cert1更新最初使用cert1签名的应用程序. (2认同)