在 iOS 上存储身份验证令牌 - NSUserDefaults 与 Keychain?

问题描述 投票:0回答:3

当用户登录服务时,我应该在哪个位置存储令牌?我不保存密码(显然我会使用钥匙串),而只是保存令牌。很多地方都说只使用

NSUserDefaults
但 Stack Overflow 上的一些人似乎非常热衷于钥匙串。

NSUserDefaults
还好吗?

ios objective-c nsuserdefaults keychain
3个回答
123
投票

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

NSUserDefaults
不安全或不加密 - 无论是在设备上还是同步到 Mac 时,都可以轻松打开和阅读。因此,虽然用户默认值是存储首选项和配置信息等内容的好地方,但它不是存储密码等敏感内容的好地方。

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


15
投票

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

钥匙串服务是为了用户明确关心的“秘密”而发明的,即密码、私钥甚至安全注释,即明确的凭据。但访问令牌是用户输入密码后生成的临时哈希值,并且有时间限制。即使被盗,犯罪分子也无法完全窃取该帐户 - 所有者可以在另一台设备上登录,并且之前的访问令牌将被重置。因此,正式而言,不禁止在 UserDefaults 中存储访问令牌。

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

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

所以,答案是——两者都可以使用。但是,如果您的应用程序运行的内容与被盗的 iPhone 相比成本很高,那么最好使用钥匙串,但这只是建议。


2
投票

所有敏感数据应存储在钥匙串中。

UserDefaults
适用于用户偏好等小数据。

© www.soinside.com 2019 - 2024. All rights reserved.