【问题标题】:Storing authentication tokens on iOS - NSUserDefaults vs Keychain?在 iOS 上存储身份验证令牌 - NSUserDefaults 与钥匙串?
【发布时间】:2013-05-23 15:04:48
【问题描述】:

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

NSUserDefaults 好吗?

【问题讨论】:

  • 使用NSUserDefaults 存储的数据即使在未越狱的设备上也很容易读取。如果您担心安全性,那么我会将数据存储在钥匙串中。您打算将身份验证令牌保留多长时间?
  • 使用Lockbox 值得一看。它确实简化了与钥匙串的接口。

标签: ios objective-c api nsuserdefaults keychain


【解决方案1】:

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

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

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

【讨论】:

  • 这是一个很好的答案。同样在 NSUserDefault 的文档中。它说该类用于偏好设置,而不是用于存储安全登录信息。
  • 我推荐钥匙串。 NSUserDefaults 的目的完全不同。
  • 投反对票,因为我认为您的答案只是默认升级为最安全的选项,而没有真正考虑到用户安全需求的上下文。
  • 这里有一个重要的警告:钥匙串项目可能会在应用程序卸载/重新安装后继续存在。对于我正在开发的应用程序,用户在卸载并重新安装后登录是不受欢迎的行为,因此钥匙串在 IMO 中并不总是一个好主意。
  • facebook 最近存储了清除密码。不要跟随它
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 这是有道理的。谢谢
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-09-24
    • 2013-11-28
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2011-10-03
    • 2013-10-12
    • 1970-01-01
    • 2017-12-29
    相关资源
    最近更新 更多