如何检测 iCloud 钥匙串的更改

Posted

技术标签:

【中文标题】如何检测 iCloud 钥匙串的更改【英文标题】:How can I detect changes to iCloud keychain 【发布时间】:2016-02-09 11:59:18 【问题描述】:

有没有办法在 iCloud(或任何)钥匙串更改(项目被添加/删除/更改)时获得通知?

类似于 KVS 中的NSUbiquitousKeyValueStoreDidChangeExternallyNotification

我想我可以在 OSX 上查看 $HOME/Library/Keychains 文件夹,但有更好的选择吗? (这甚至可以在 ios 上运行吗?)

【问题讨论】:

【参考方案1】:

AFAIK 钥匙串服务,无论钥匙串是本地的还是 iCloud 钥匙串,都不会宣布更改。您应该如何使用钥匙串的方式也让人怀疑这样做。

存储在钥匙串中的密码数据受到保护,因为它始终被加密。只有当您请求该数据时,它才会被临时解密,仅供您使用,解密后的副本会传递给您的应用程序,然后被丢弃。您应该将该解密副本用于您需要的任何任务,然后也将其丢弃。

为什么要丢弃它?因为当你把它放在你的应用程序中时它是不安全的。根进程可以转储应用程序的所有内存,然后此转储还将包含所有缓存的纯文本密码。并且使用 iOS 中的一个安全漏洞,也许我们甚至还不知道,攻击者可能能够以 root 权限运行代码(毕竟,所有越狱都基于这样一个漏洞,所以你看,它们确实存在)。

当您再次需要它时?然后你再次从钥匙串中获取它。每次需要时,您都应从钥匙串中获取密码。那么为什么需要检测变化呢?当你获取它时,你要么会得到一个结果,在这种情况下,你总是有存储到钥匙串的最新密码,无论最近几分钟更新的频率如何,或者你没有得到任何结果,因此知道有钥匙串中没有这样的密码,因为要么从来没有,要么已被删除。无论如何,您都需要在您的应用中处理“从未有密码”的情况,并且通常您可以处理“密码已删除”的情况完全相同。 p>

【讨论】:

这个问题很老,但感谢您的长回答。我认为这个想法是,一旦失败,您只需在一台设备上添加密码或证书,它就会传播到所有设备。 @hnh 证书无法通过 iCloud 同步,只能同步密码。如果您需要在本地检测自上次尝试使用密码后是否更改了密码,只需记住密码的最后修改日期即可。此日期与安全无关,例如可以将其存储到 NSUserDefaults 中,并且每次更新密码项时都会更新。 好吧,正如我所写,我想要推送,而不必自己实现推送(如前所述,如 NSUbiquitousKeyValueStoreDidChangeExternallyNotification,尽管我想我可以将你提到的日期写给 KVS ! :-) )。例如。所有设备无法与服务器同步,密码错误。你输入一个密码。它通过 iCloud 钥匙串与其他人同步。理想情况下,他们应该自动重试(因为他们发现某些地方发生了变化,值得再次尝试)并开始同步。

以上是关于如何检测 iCloud 钥匙串的更改的主要内容,如果未能解决你的问题,请参考以下文章

Mac钥匙串有啥用?钥匙串访问是啥

iOS 钥匙串服务与 iCloud 钥匙串不同吗?

kSecAttrSynchronizable 需要 iCloud 钥匙串吗?

如何在我的应用程序中使用 iCloud 钥匙串在不同设备的安装之间共享价值?

iCloud 钥匙串不断丢失数据

iCloud 钥匙串在更新时通知