77

当用户登录服务时,我应该在哪个位置存储令牌?我没有保存密码(显然是我使用钥匙串的地方),而只是保存了令牌。很多地方都说只使用 NSUserDefaults,但 StackOverflow 上的一些人似乎真的很喜欢钥匙串。

NSUserDefaults 好吗?

4

3 回答 3

117

我强烈建议您使用钥匙串——这正是 Facebook 用来存储会话令牌的方法。

NSUserDefaults不安全或不加密 - 它可以在设备上和同步到 Mac 时轻松打开和读取。因此,虽然用户默认设置是存储偏好和配置信息之类的好地方,但它不是存储敏感信息(如密码)的好地方。

会话令牌应该几乎总是与密码相同,因此您应该将它们安全地存储在钥匙串中,在那里它们将被加密。Apple 有一些示例代码 ( GenericKeychain ) 显示了基本实现,您可以通过搜索 StackOverflow 找到其他示例。希望这对您有所帮助。

于 2013-05-28T15:18:42.607 回答
15

NSUserDefaults 可以毫无问题地使用(对于令牌!)。请查看文档https://developer.apple.com/documentation/security/keychain_services

钥匙串服务是为用户明确关心的“秘密”而发明的,即密码、私钥甚至安全笔记,即清晰的凭据。但访问令牌是用户输入密码后生成的临时哈希,时间有限。即使被盗,作恶者也无法完全盗取账户——所有者可以在另一台设备上登录,之前的访问令牌将被重置。因此,正式地没有禁止在 UserDefaults 中存储访问令牌。

来自 UserDefaults 的数据只有在设备本身被盗的情况下才能被盗,但我认为内容的安全级别远低于物理设备本身。我认为在这种情况下用户不会担心令牌,而是担心设备。

但是,将其存储在 Keychain 中是一种很好的做法,但这只是过度使用(!)安全性,通常由 Internet 中的随机用户推荐,Apple 并不要求这样做。苹果没有文档,他们说令牌必须存储在钥匙串中(如果你能找到一个,请在下面评论一个)。

所以,答案是——你可以同时使用。但是,如果您的应用程序使用的内容与被盗 iPhone 相比要花费很多,那么最好使用 Keychain,但这只是一个建议。

于 2019-01-16T08:40:41.947 回答
2

所有敏感数据都应存储在钥匙串中。 UserDefaults适用于用户偏好等小块数据。

于 2019-11-04T18:40:27.417 回答