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

Dou*_*ith 64 api objective-c keychain nsuserdefaults ios

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

NSUserDefaults很好吗?

lxt*_*lxt 92

我强烈建议你使用钥匙串 - 这正是Facebook为存储会话令牌而做的事情.

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

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

  • 这是一个很好的答案.另外在NSUserDefault的文档中.它表示该类用于首选项,而不是用于存储安全登录信息. (4认同)
  • 这里有一个重要的警告:钥匙串项目可能会在应用程序卸载/重新安装后幸存下来。对于我正在开发的应用程序,用户在卸载并重新安装后登录是不需要的行为,因此在我看来,钥匙串并不总是一个好主意。 (2认同)

Ale*_*kov 14

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

钥匙串服务被发明为用户明确关心的“秘密”,即密码、私钥或什至安全笔记,即清晰的凭证。但是访问令牌是用户输入密码后生成的临时哈希,时间有限。即使被盗,犯罪者也不能完全盗取帐户 - 所有者可以在另一台设备上登录,并且先前的访问令牌将被重置。因此,从形式上讲,没有禁止在 UserDefaults 中存储访问令牌。

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

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

所以,答案是 - 您可以同时使用两者。但是,如果您的应用使用的内容与被盗 iPhone 相比成本更高,那么最好使用 Keychain,但这只是一个建议。