帮助在iPhone应用程序上实现钥匙串的有用实现

时间:2010-09-21 14:29:59

标签: iphone keychain

用户已经在我的iphone应用程序上请求“锁定”,这很有意义,因为它包含私人信息。我相信数据加密超出了人们对手机的期望,因此我的目标只是防止无意中访问应用程序。我的计划是使用钥匙串使用我的应用名称作为ServiceName来存储密码。

我担心的是,如果用户丢失/忘记了他们输入的密码,会发生什么。有什么我可以以编程方式进行以允许用户重置吗?删除应用会删除该应用的钥匙串吗?

我不想收集用户的电子邮件。 (嗯,我这样做,但我不希望这是理由。)并且如果用户丢失了密码,则不希望用户被永久锁定在应用程序之外。

3 个答案:

答案 0 :(得分:1)

这里通常的方法是除了(更短,更快)的密码或PIN之外,还收集一组安全问题和答案。如果用户忘记密码,她应该记得她更长,更麻烦的安全问题的答案。

您可以将它们存储在应用程序的钥匙串中。

答案 1 :(得分:1)

在iPhone上只有一个钥匙串数据库,并且不可能添加自定义的,特定于应用程序的钥匙串(正如你在Mac上可以做的那样)。默认情况下,您添加到应用中钥匙串的钥匙串项目仅适用于您的应用。没有文档(据我所知)说明当用户删除你的应用程序时发生的行为:可能是iOS 4.1删除了应用程序的钥匙串项目,可能会将它们留在钥匙串中。

根据您存储用户密码的方式,您可以检索它。例如,如果您在kSecAttrApplicationTag中存储了与您的应用程序相关的标记以及用户密码,那么您可以使用

在钥匙串中搜索您的确切标记。
OSStatus SecItemCopyMatching (
   CFDictionaryRef query,
   CFTypeRef *result
);

功能。如果搜索成功,您可以使用kSecValueData键从返回的词典中检索密码,或者,如果您愿意,甚至可以使用

更改密码。
OSStatus SecItemUpdate (
   CFDictionaryRef query,
   CFDictionaryRef attributesToUpdate
);

有关其他信息,请参阅the keychain referenceKeychain Services Tasks for iOS文档。

答案 2 :(得分:0)

回顾过去,我发现我从未根据实际实施情况更新此问题。

我的问题的核心是我没有我的用户的联系信息,我也没有以任何方式复制他们的数据。也就是说,我通过不启用互联网或电子邮件功能,让他们的数据保持私密性。

因此,我使用了上面建议的SecItemUpdate,同时也为应用程序编写了默认密码(即没有密码等效)。然后,如果用户丢失密码,他们可以告诉应用程序密码丢失,此时应用程序将密码重置为默认密码并删除数据库中的所有私人数据。因此,丢失密码会产生成本,但在任何时候都不能有人进入并查看私人数据。

我已经使用这种方法几年了,它似乎很好地满足了我的用户。