在 iOS 上存储身份验证令牌 - NSUserDefaults 与钥匙串?
Posted
技术标签:
【中文标题】在 iOS 上存储身份验证令牌 - NSUserDefaults 与钥匙串?【英文标题】:Storing authentication tokens on iOS - NSUserDefaults vs Keychain? 【发布时间】:2013-05-23 15:04:48 【问题描述】:当用户登录服务时,我应该在哪个位置存储令牌?我没有保存密码(显然是我使用钥匙串的地方),而只是保存了令牌。很多地方都说只使用 NSUserDefaults,但 *** 上的一些人似乎真的很喜欢钥匙串。
NSUserDefaults 好吗?
【问题讨论】:
使用NSUserDefaults
存储的数据即使在未越狱的设备上也很容易读取。如果您担心安全性,那么我会将数据存储在钥匙串中。您打算将身份验证令牌保留多长时间?
使用Lockbox 值得一看。它确实简化了与钥匙串的接口。
【参考方案1】:
我强烈建议您使用钥匙串 - 这正是 Facebook 用来存储会话令牌的方法。
NSUserDefaults
不安全或未加密 - 无论是在设备上还是在同步到 Mac 时,都可以轻松打开和读取它。因此,虽然用户默认设置是存放偏好和配置信息等内容的好地方,但它不是存放敏感信息(如密码)的好地方。
会话令牌应该几乎总是与密码相同,因此您应该将它们安全地存储在钥匙串中,在那里它们将被加密。 Apple 有一些示例代码 (GenericKeychain) 显示了基本实现,您可以通过搜索 *** 找到其他示例。希望对您有所帮助。
【讨论】:
这是一个很好的答案。同样在 NSUserDefault 的文档中。它说该类用于偏好设置,而不是用于存储安全登录信息。 我推荐钥匙串。 NSUserDefaults 的目的完全不同。 投反对票,因为我认为您的答案只是默认升级为最安全的选项,而没有真正考虑到用户安全需求的上下文。 这里有一个重要的警告:钥匙串项目可能会在应用程序卸载/重新安装后继续存在。对于我正在开发的应用程序,用户在卸载并重新安装后登录是不受欢迎的行为,因此钥匙串在 IMO 中并不总是一个好主意。 facebook 最近存储了清除密码。不要跟随它【参考方案2】:NSUserDefaults 可以毫无问题地使用(对于令牌!)。 请查看文档https://developer.apple.com/documentation/security/keychain_services
钥匙串服务是为用户明确关心的“秘密”而发明的,即密码、私钥甚至安全笔记,即清晰的凭据。但访问令牌是用户输入密码后生成的临时哈希,时间有限。即使被盗,作恶者也无法完全盗取账户——所有者可以在另一台设备上登录,之前的访问令牌将被重置。因此,正式地没有禁止在 UserDefaults 中存储访问令牌。
UserDefaults 中的数据只有在设备本身被盗的情况下才能被盗,但我认为内容的安全级别远低于物理设备本身。我认为在这种情况下用户不会担心令牌,而是担心设备。
但是,将其存储在 Keychain 中是一种很好的做法,但这只是对安全性的过度 (!) 使用,通常由 Internet 中的随机用户推荐,Apple 并不要求这样做。 Apple 没有文档,他们说令牌必须存储在钥匙串中(如果你能找到,请在下面评论一个)。
所以,答案是 - 你可以同时使用。但是,如果您的应用运行的内容与被盗 iPhone 相比要花费很多,那么最好使用 Keychain,但这只是一个建议。
【讨论】:
这是有道理的。谢谢【参考方案3】:所有敏感数据都应存储在钥匙串中。
UserDefaults
用于用户偏好等小块数据。
【讨论】:
以上是关于在 iOS 上存储身份验证令牌 - NSUserDefaults 与钥匙串?的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 和身份验证令牌错误代码 -1011
仅使用 Facebook 令牌在 iOS 上发送 Firebase 邀请登录 Firebase 身份验证
如何验证在 jwt.io 上使用 Keycloak 身份验证提供程序创建的 HS256 签名 JWT 令牌
在 iOS 上通过 Spotify App Remote 的 SPTSession 进行身份验证时获取一个奇怪的刷新令牌