iOS 钥匙串中的项目能否在应用程序卸载和重新安装后继续存在?

Posted

技术标签:

【中文标题】iOS 钥匙串中的项目能否在应用程序卸载和重新安装后继续存在?【英文标题】:Will items in iOS keychain survive app uninstall and reinstall? 【发布时间】:2013-09-25 12:38:41 【问题描述】:

我正在寻找有关 ios 钥匙串项目的文档。我的具体问题是钥匙串项目是否能在应用程序卸载和重新安装周期中存活下来。 从 iOS 4(甚至可能是 iOS 3)开始,它似乎就以这种方式工作,但我找不到任何来自 Apple 的文档说明这实际上应该以这种方式工作。

我想弄清楚的是,我是否可以相信(不是“希望”或“猜测”)钥匙串中的项目将在应用卸载后继续存在。

编辑:我意识到正如 Daij-Djan 所指出的那样,这个问题有点不清楚。我正在寻找的是支持众所周知的行为的官方文档。

2017-04-04 更新:请参阅下面的答案,即 iOS 10.3 测试版中的行为变化。它在 iOS 10.3 中照常工作,但在未来的版本中可能会发生变化。

【问题讨论】:

我们从经验中知道是这种情况,但我在 Keychain Services Programming Guide 或会话 WWDC 2010 209 Securing Application Data 中找不到 Apple 提供的任何文档。 我觉得这很有趣,在我的锡箔帽时刻,我想 Apple 会避免记录这一点,以便他们可以根据自己的意愿更改(并且可能会)(这也很奇怪,他们有之前在 iOS 中改变了不同的行为)。没有关于众所周知的行为的官方文档似乎很奇怪。 为什么投反对票?请解释一下,以便我改进问题。 【参考方案1】:

是的,他们会的。

查看我的相应问题:

How to find out WHEN a user bought the app / installed it for the first time (possible without UDID?)


在我看来:

“官方”暗示钥匙串适用于多个应用程序......并且它“属于”操作系统:

Apple Documentation

钥匙串是一个加密的容器,用于保存密码 多个应用程序和安全服务。

=> 因此钥匙串在应用程序中仍然存在

一个钥匙串项可以在多个应用程序之间共享

【讨论】:

是的,我知道它目前是这样工作的,但你的回答没有回答我的问题。我想知道我是否可以依赖它,为此我想从 Apple 那里获得某种文件,说明情况就是这样。 >> 我明白你的意思,但引用:“我的具体问题是钥匙串项目是否能在应用程序卸载和重新安装周期中幸存下来”:D 抱歉,我现在已经编辑了我的问题,让它更清楚一点。 关于您添加的应用程序之间共享:这是由访问组 (keychain-access-groups) 定义的,iOS 可能会保留一个引用计数,以便没有安装可以访问的应用程序的钥匙串项目它们被删除(类似于持久的 UIPasteboard)。我同意它们很可能不会被删除,但我找不到说明它们保证不会被删除的文档。关闭,但没有雪茄 :-)。 5 年后 - 全部不变 - 钥匙串在应用卸载后仍然存在【参考方案2】:

也许这就是你要找的。Apple Documentation

注意:在 iPhone 上,钥匙串权限取决于用于签署您的应用程序的配置文件。请务必在应用程序的不同版本中始终使用相同的配置文件。

【讨论】:

我已阅读该内容,但找不到任何说明钥匙串项目将在应用程序卸载后继续存在的内容。你能找到什么吗?官方文档中的引用正是我想要的。 对我来说,以下文字间接暗示了这一点。 “注意:在 iPhone 上,钥匙串权限取决于用于签署应用程序的配置文件。确保在不同版本的应用程序中始终使用相同的配置文件。”这意味着,如果您删除旧版本的应用程序并安装更高版本。因此,只要开发者使用了相同的配置文件,之后新安装的应用程序版本就可以访问相同的钥匙串数据。 @user523234 我确认了这种行为,但我只是怀疑如果配置文件过期并更新怎么办?谁能证实这一点? @NimitPattanasri 我可以确认过期的更新配置文件不会影响行为,它的钥匙串项目仍然存在。【参考方案3】:

我在 Apple 开发人员论坛上进行了搜索,一位 Apple 开发人员(eskimo1,又名 Quinn)在 2012 年 8 月 27 日表示,这是当前的行为,但据他所知,这是 /documented/ 行为,所以这个将来可能会改变。他还说,删除共享钥匙串项目总是很棘手,这也是该问题尚未解决的原因之一。

所以我想这让问题悬而未决:没有明确的答案。它没有记录在案,并且可以随时更改。依赖它可能会导致将来出现问题。

2017 年 4 月 4 日更新:

iOS 10.3 测试版中,卸载应用时会删除应用的钥匙串信息,但在最终的 10.3 版本中似乎已删除此行为。在Apple Documentation 建议这即将改变,我们不应该依赖于应用程序卸载后钥匙串访问数据完好无损。 另见iOS 10.3 beta 3 doesn't persist data of KeychainItem。

【讨论】:

很棒的发现——仅供参考,爱斯基摩人在 2015 年 10 月 15 日的论坛中重复了这个指导(“确实。这种行为更多是实现的人工制品,而不是设计的功能 [.. .] 你真正要问的问题是,如果这种行为发生变化,我的曝光率是多少?" @sherb 这很奇怪,我刚刚在 iOS 11.03 上测试了我们的应用(仅限该供应商的应用)的卸载安装场景,并且没有删除钥匙串条目。我们正在使用 kSecAttrAccessibleWhenUnlockedThisDeviceOnly 存储通用密码,您如何存储您的条目? @AndreasPaulsson:你是对的。我错误地对测试进行了编码并得到了假阴性。从 iOS 11.0.3 开始,钥匙串数据似乎在删除应用程序后仍然存在。我已经删除了我之前的评论以避免混淆任何人。

以上是关于iOS 钥匙串中的项目能否在应用程序卸载和重新安装后继续存在?的主要内容,如果未能解决你的问题,请参考以下文章

访问钥匙串中的安全项目有时会在 iOS 中返回错误 -25308 (errSecInteractionNotAllowed)

即使在从钥匙串访问和 App Store Connect 中删除后,重新启动 Xcode 时,已删除的 iOS 证书仍会继续显示在钥匙串中

检索钥匙串中的数据以获取在 ios 中不起作用的特定服务

如何在ios钥匙串中手动存储?

有啥方法可以保存数据,即使在没有钥匙串的情况下在 ios 上重新安装应用程序?

即使在钥匙串中也找不到 iOS 应用商店分发证书