Google Play 应用签名和签名级别权限

3

我希望使用签名级别权限来安全地在两个应用程序之间共享数据。不幸的是,即使我在两个应用程序中使用相同的上传密钥进行签名,Google Play在上传到商店后也会更改它们的签名。因此,我的应用程序无法通信。 如果我们使用 Google Play 应用签名,如何在两个应用程序中使用相同的键/证书进行签名?

2个回答

3
我做了一些研究,现在想在这里解释一下Google Play应用签名的工作原理以及如何使用它与签名级别权限。首先,如果我们使用Google Play应用签名,实际上会使用两个密钥来对我们的应用进行签名。第一个是上传密钥,第二个是应用签名密钥。两者都是从Android Studio中以相同的方式生成的,我们可以将一个应用的上传密钥用作另一个应用的应用签名密钥。
应用签名密钥存储在Google Play中,在上传后我们无法访问它。当我们为现有应用程序注册Google Play应用签名时,我们有可能上传它,或者Google Play可以为新应用程序生成它,然后我们根本无法访问它。我们可以说应用签名密钥实际上是我们用于向用户分发应用程序的真正密钥。
整个机制看起来像这样:

Google Play app signing mechanism

官方应用签名文档的图像来源

正如您在图像上所看到的,我们使用上传密钥将我们的应用程序上传到Google Play,然后Google Play会删除我们的签名,并使用不同的密钥对我们的应用程序进行签名。这很有用,因为如果我们丢失了上传密钥,我们将不会失去上传应用程序的可能性(我们可以向Google请求使用新的上传密钥)。此外,Google Play现在可以将我们的应用程序拆分成更小的部分并独立分发,每个部分都将使用我们的应用程序签名密钥进行签名(Android应用程序包)。 这种解决方案的缺点是,我们上传到商店的应用程序具有与我们从Google Play下载的应用程序不同的签名。 这非常棘手,特别是如果我们在应用程序中使用签名级别权限。此外,当我们想要将应用程序上传到不同于Google Play的商店时,这也是一个问题。

通过使用签名级别权限,我们可以以安全的方式在两个应用程序之间共享数据(用例示例),但有一个主要条件-两个应用程序必须具有相同的签名。 即使我们使用相同的上传密钥,这并不意味着我们的应用程序将具有相同的签名,因为Google Play使用的密钥可能是不同的。 实际上,这意味着当您测试应用程序的发布版本时,一切看起来都很好,但是在将其上传到Google Play后,它不起作用(此问题影响取决于应用程序签名的每个功能- Facebook登录,篡改检测)。
那么,在使用Google Play应用程序签名时如何为两个应用程序使用相同的密钥? 当我们在Google Play中创建新应用程序并尝试创建第一个发布版本以进行生产时,Google Play会询问: enter image description here 然后在高级选项下,我们可以找到:

enter image description here

之后,两个应用程序将为我们的用户具有相同的签名。不幸的是,如果我们尝试为已经发布给我们的用户的应用程序(稍后可以加入Google Play应用程序签名)执行此操作,则没有此选项可用,我们无法使用相同的密钥。

如果我们无法这样做但希望在两个应用程序之间使用安全数据共享呢?我们可以手动验证不同的签名并尝试防止来自提供数据的应用程序内部的攻击。这不像第一个解决方案那样安全,但比什么都不做更安全 :)


2
你发现,共享相同的上传密钥并不意味着应用程序签名密钥也会被共享。但是,在首次注册Play应用签名时,有一种方法可以做到这一点:在注册卡片的“高级”部分下,有一个选项可以重用已经注册了Play应用的另一个应用程序的应用程序签名密钥。
然而,你需要创建一个新的应用程序,因为目前没有改变应用程序签名密钥的方法。
这在此页面文档中有记录:Opt in to app signing by Google Play > "New apps"。
希望能对你有所帮助。

如果应用程序已经发布并使用第二个应用程序的“上传密钥”在商店中可用,那怎么办?我能够注册App签名并更改此密钥吗?更新呢?我应该在发布之前注册对吧? - lukjar
你的两个应用程序都已经完全发布并拥有用户基础了吗?如果其中至少一个没有,我建议创建另一个应用程序,因为应用签名密钥无法更改。如果这不是一个选项,我建议联系Play控制台支持团队,看看他们是否能够解决此问题。 - Pierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接