ios - 存储用户凭据 iOS 的推荐方式?

标签 ios swift nsuserdefaults keychain

我在我的应用程序中执行“记住我”功能,我遇到了将所有凭据存储在钥匙串(keychain)中的解决方案和仅将密码存储在钥匙串(keychain)中的解决方案?存储的密码我只想在身份验证时使用,但是我更多地使用用户名,而不是必须从后端获取它,我可以从磁盘中获取它。所提到的解决方案中的一种是否比另一种更好?

身份验证后,如果我采用拆分解决方案,我会这样做:

let hasLoginKey = NSUserDefaults.standardUserDefaults().setBool(true, forKey: "loginKey")
    NSUserDefaults.standardUserDefaults().setValue(username, forKey: "username")

最佳答案

你问的是“推荐”。推荐的做法是根本不存储密码。设计您的服务,使其接受该服务独有的访问 token 。您接受用户名和密码,服务器返回给您一个访问 token ,您存储访问 token ,然后丢弃密码(可能还有用户名)。 OAuth 是实现这一点的标准化方式,具有可用的通用服务器和客户端框架。 (虽然 OAuth 的复杂性让我有点发疯,但它确实是一个很好的协议(protocol),而且非常标准。)

存储授权 token 的正确位置是钥匙串(keychain)。正如 Zaph 指出的那样,“双重加密” secret 不会给您带来任何好处,因为您现在有另一个 secret (加密 key )要存储。你把它存放在哪里?如果您有一个更安全的地方来存储您的加密 key ,请将 token 放在那里。如果使用硬编码 key 稍微混淆它会让您感觉更好,那很好,但安全优势非常小。

如果您不能按照推荐的方式设计您的服务,并且必须存储原始密码,则将其存储在钥匙串(keychain)中。往上看。所有相同的论点都适用。钥匙串(keychain)是手机上最安全的地方。这并不意味着它牢不可破。这只是意味着它比您存放东西的任何其他地方都不易碎。

关于ios - 存储用户凭据 iOS 的推荐方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39225375/

相关文章:

ios - 自定义 UITableViewCell 的背景是有效的,除了第一次接触时以外

objective-c - AVMutableVideoComposition 有时无法播放视频

ios - swift UserDefaults 返回 nil 作为 NSMutableArray

ios - 有什么方法可以在图形库中使用真实对象来获取核心数据

iphone - iOS:下载脚本并执行?

ios - 如何在 Swift 中解释从 CMSampleBuffer 派生的像素数组

ios - 滑动删除与 iOS 10+ 类似的设计通知滑动删除 UITableViewCell

iOS - 在更新期间调试 NSUserDefault 崩溃的任何建议

ios - 永久存储数组的问题

ios - 如何使用 VLC 从 iOS 设备广播本地视频并通过同一 WiFi 网络中的其他 iOS 设备接收视频流?