应用程序被杀死时删除钥匙串

Posted

技术标签:

【中文标题】应用程序被杀死时删除钥匙串【英文标题】:Delete Keychain when app is killed 【发布时间】:2015-04-20 08:57:21 【问题描述】:

我正在使用以ios7为目标的钥匙串,我使用属性:kSecAttrAccessibleWhenUnlockedThisDeviceOnly

效果很好,设备锁定 10 秒后,钥匙串变量无法访问。

我现在想要的是在应用程序被杀死之前删除钥匙串。 applicationWillTerminate 仅在应用程序在进入后台之前被终止或系统释放应用程序时调用。如果应用程序在被用户杀死之前在后台运行了 1 分钟,我找不到清除钥匙串的方法。

当应用在后台几分钟后被用户杀死时,有什么方法可以删除钥匙串或调用函数?

【问题讨论】:

不是真的,为什么要删除? 我正在使用加密敏感数据的钥匙串,如果应用程序被用户手动杀死,我想清除所有内容。如果调用 applicationWillTerminate 我清除钥匙串,但还不够...... 另见***.com/q/3712979。 【参考方案1】:

有什么办法可以删除钥匙串...

没有。在 iOS 上,只有一个钥匙串和一个共享资源。

如果有兴趣,请从数据安全的角度阅读以下内容。自 iOS 4/5 天以来没有太大变化。我认为最有趣的新事物是用于 iOS 7(或者是 6?)的NSSecureCoding Protocol 和指纹认证。

迪诺·扎维的Apple iOS 4 Security Evaluation Sogeti ESEC 的iOS 5 data protection updates Belenko 的 Blackhat 幻灯片 Evolution of iOS Data Protection and iPhone Forensics

或者当应用在后台几分钟后被杀死时调用一个函数

是和不是。 -applicationWillTerminate 没有发送,尽管文献上说了什么。相反,您知道当SIGKILL 到达时您正在终止。而且你不能困住它。但是您也许可以执行快速擦除并从sighandler 返回(我从未尝试过,所以我不知道)。

当数据敏感性保证时使用的策略是在您的代表收到-applicationWillResignActive 时开始擦除数据。或者在-applicationWillResignActive 到达时启动计时器,但在-applicationWillEnterForeground 到达时取消它。如果时间过去,则开始擦拭。但两者都会造成糟糕的用户体验。

【讨论】:

确实,我在后台有一个计时器,如果应用程序在后台时间过长,我会清除钥匙串(实际上是钥匙串中的变量)。所以从你所说的来看,还没有办法捕捉到这个“应用程序在后台被用户杀死”事件? "...实际上是我钥匙串中的变量..." - 哦,那是SecItem,你可以删除它。但是您应该在删除它之前覆盖它,因为 Apple 的安全分配器调用标准删除器(而不是安全删除器)。几年前我向他们报告了这个错误,但仍未修复。 “所以从你所说的来看,还没有办法捕捉到这个“应用程序在后台被用户杀死”事件” - 据我所知,答案是不。你会看到SIGKILL 飞过,但你不能困住它。不过,您可以执行快速擦除并从sighandler 返回。而且您也许可以在越狱设备上执行此操作(对我来说,JB 是例外而不是规则)。 好吧,我从我的研究中了解到这是不可能的,但是 *** 上的确认足以让我停止我的研究:)。非常感谢Jww! @Pull - 没问题。请务必查看 Zavi 的论文和 Sogeti ESEC 的论文。您不会在其他地方(例如 Apple 的网站)找到该信息。它有很多你可能会感兴趣的内部工作细节。

以上是关于应用程序被杀死时删除钥匙串的主要内容,如果未能解决你的问题,请参考以下文章

卸载应用程序时删除钥匙串项

詹金斯删除钥匙串中的钥匙

MacBook钥匙串怎么关闭

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

来自钥匙串的 Swift 4 WKWebView 身份验证

iOS 钥匙串在设备之间共享数据