安卓密钥库文件是什么?它有什么用途?

144

这是一个通用问题,但我特别想了解它在Android上的用途。什么是密钥库文件,它有什么用?

多个Android应用程序可以使用同一个密钥库来签署他们的应用程序("签名"一个.apk文件到底意味着什么?),这会有什么影响(如果有的话)?


1
你似乎混淆了两个主题。第一个是密钥库,第二个是APK签名。另外请参考Nikolay Elenkov的《Android安全内部:深入了解Android安全架构》(https://www.amazon.com/dp/1593275811)。 - jww
4个回答

151
我提供的答案是,密钥库文件用于向任何询问身份验证的人进行身份验证。它不仅限于签署 .apk 文件,您可以使用它来存储个人证书、签署要传输的数据以及各种身份验证。

就Android方面而言,您可能正在寻找如何处理密钥库文件,因为您提到了签署apk文件,这是您的证书。您正在使用自己的凭据为应用程序打品牌。您可以使用同一个密钥为多个应用程序打品牌,事实上,建议您使用同一证书为自己编写的多个应用程序打品牌。这样更容易跟踪属于您的应用程序。

我不确定您所说的 "影响" 是什么意思。我想这意味着只有持有您的证书的人才能更新您的应用程序。这意味着如果您将其发布到公共平台后,丢失用于签名应用程序的证书,则无法发布更新,请确保安全地备份证书。

除了签署apk并发布到公共平台外,您还可以使用它在Android设备和服务器之间进行SSL身份验证(也与其他功能相关)。


2
非常好的答案。在这里还应该注意,如果您要在应用程序中使用“推送数据”,则需要一个密钥库文件! - KapteinMarshall
密钥库是机器特定的吗?或者我们可以在任何机器上使用它来更新应用程序吗? - Yawar
13
好的解释。你能否解释一下为什么我们需要KeyStorePassword、Key alias和KeyPassword呢?似乎有三个密钥是多余的。当使用Java KeyStore来保存和管理私钥和证书时,KeyStorePassword用于保护整个KeyStore文件。Key alias是每个在KeyStore中存储的私钥和证书的唯一标识符。而KeyPassword则用于保护单个私钥或证书的访问。这三个密钥都有各自的作用,它们不是重复的,而是为了提供更全面的安全性保护。 - ARK
1
我曾经认为每当你要构建一个项目时,它就像撒旦一样折磨你。 - Mike Pandolfini
检入Git有什么不好的地方吗?如果有,是什么? - Pim van der Heijden

23

Android Market要求您使用公共/私有密钥机制(证书由您的私钥签名)对您发布的所有应用程序进行签名。这提供了一层安全性,可以防止远程攻击者向市场推送恶意更新(所有更新必须使用相同的密钥进行签名)。

根据Android Developer网站的App-Signing Guide所述:

  

总体而言,所有开发人员建议的策略是在预期应用程序寿命内使用相同的证书为所有应用程序进行签名。 有几个原因你应该这样做...

使用相同的密钥有一些好处-其中一个是更容易在使用相同密钥签名的应用程序之间共享数据。 另一个是允许使用相同密钥签名的多个应用程序在同一个进程中运行,因此开发人员可以构建更多“模块化”的应用程序。


1
提示:另一个选项是,如果它们是完全不相关的应用程序,我建议使用不同的密钥库。 如果您最终出售其中一个应用程序,您可以放弃相应的密钥库,而不会危及其他应用程序的安全性。 - Ahmed Nabil

11
你可以在官方Android文档这里找到有关签名过程的更多信息:http://developer.android.com/guide/publishing/app-signing.html 是的,你可以使用相同的密钥库签署多个应用程序。但是必须记住一件重要的事情:如果要在Play商店上发布应用程序,则必须使用非调试证书进行签名。如果有一天你想为此应用程序发布更新,则用于签署apk的密钥库必须相同。否则,你将无法发布更新。

4
不,这是错误的。您用来签署apk的密钥库可能不同,但您用来签署apk的密钥必须相同。密钥库文件只是用于存储密钥和证书信息的文件,您可以在同一密钥库文件中拥有多个密钥实体。 - zeleven

0
整个 keytool 的概念是使用唯一标识符为您的 apk 签名,以指示该 apk 的来源。据我所知,keystore 文件用于调试,因此您的 apk 具有 keytool 的功能,而无需为生产签署您的 apk。因此,是的,出于调试目的,您应该能够使用单个 keystore 签署多个 apk。但请注意,在推向生产环境时,您需要为创建的每个 apk 使用唯一的 keytool 作为标识符。

您无需对应用程序进行签名即可在模拟器或实际设备上进行调试。 - Marcus
我并不是说你必须签名才能调试它...但你可以使用密钥库作为keytool的测试实现。 - Adam Storm
我认为你指的不是 keytoolkeytool 是一个 Java 程序,用于生成密钥库。 - Otra
是的,你说得对,keytool 不是我想要的。我想说的是 'key'。我只是试图向提问者解释,在调试时可以使用公共 apk 密钥,但在发布后,每个 apk 都需要具有唯一的密钥以进行编辑和升级。 - Adam Storm
谢谢提供这些信息!在开发讲座上向我解释说,如果没有唯一的键,就无法更新单个apk... 我猜你使用密钥/apk名称作为唯一标识符进行更新服务? - Adam Storm
显示剩余2条评论

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