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


70

用户登录服务时应在哪个位置存储令牌?我不是保存密码(显然是在使用钥匙串的地方),而是令牌。很多地方说只使用NSUserDefaults,但是StackOverflow上的某些人似乎真的很热衷于钥匙串。

NSUserDefaults可以吗?


3
使用NSUserDefaults来存储的数据即使在非越狱设备上也易于读取。如果您担心安全性,那么我会将数据存储在钥匙串中。您打算将身份验证令牌保留多长时间?
Ric Perrott

值得一看的是使用Lockbox。它确实简化了与钥匙串的接口。
Mike Pollard

Answers:


102

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

NSUserDefaults不安全或不加密-在设备上以及与Mac同步时都可以轻松打开和阅读。因此,尽管用户默认值是诸如首选项和配置信息之类的好地方,但对于诸如密码之类的敏感内容却不是一个好地方。

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


4
这是一个很好的答案。同样在NSUserDefault的文档中。它说该类用于首选项,而不用于存储安全的登录信息。
托尼

我确实推荐钥匙扣。NSUserDefaults用于所有目的。
arango_86 '19

拒绝投票,是因为我认为您的答案只是默认情况下升级为最安全的选项,而没有真正涉及用户安全需求的上下文。
Brian Ogden

1
这里有一个重要的警告:钥匙串物品可能会在应用程序卸载/重新安装后幸存下来。对于我正在处理的应用程序,在卸载并重新安装后用户登录是不受欢迎的行为,因此,IMO并不总是一个好的主意。
克里斯托弗·范·兰德肖特

10

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

钥匙串服务被发明为用户明确关心的“秘密”,即密码,私钥或什至是安全便笺(即清晰的凭证)。但是访问令牌是用户输入密码后生成的临时哈希,并且时间有限。即使被盗,恶意分子也无法完全窃取该帐户-所有者可以在另一台设备上登录,并且先前的访问令牌将被重置。因此,正式地,没有禁止将访问令牌存储在UserDefaults中。

仅当设备本身被盗时,才能从UserDefaults中窃取数据,但是我认为内容的安全级别远低于物理设备本身。我认为用户在这种情况下不必担心令牌,而可以担心设备。

但是,将其存储在钥匙串中是一个好习惯,但这只是对安全性的过度使用(!),通常由Internet上的随机用户推荐,而Apple并不需要。苹果公司没有任何文档,他们说令牌必须存储在钥匙串中(如果可以找到,请在下面注释一个)。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.