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

Posted

技术标签:

【中文标题】存储用户凭据 iOS 的推荐方式?【英文标题】:Recommended way to store users credentials iOS? 【发布时间】:2016-08-30 10:43:39 【问题描述】:

我正在我的应用程序中执行“记住我”功能,我遇到了将所有凭据存储在 Keychain 中的解决方案以及将密码存储在 Keychain 中的解决方案?我只想在身份验证时使用的存储密码,但是我更多地使用用户名,而不必从后端获取它,我可以从磁盘中获取它。上述解决方案之一是否比另一个更好?

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

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

【问题讨论】:

无论如何都可以,如果您存储在钥匙串中,我认为即使在用户删除应用程序后它也会持续存在,否则性能没有实际差异,您不应该从磁盘中获取它 ALL THE TIME,只需获取一次,并在应用程序生命周期内将其用作属性 如果用户名是例如电子邮件地址,那么它应该是安全的。这取决于贵组织的安全审查。他们可能不喜欢不加密用户名。当您删除应用程序时,UserDefault 将作为其在沙箱内被删除,但钥匙串内容将保留,因为钥匙串将数据存储在沙箱外。因此,当用户再次安装该应用程序时,您将拥有他的密码但没有用户名(它在 UserDefault 中)。你他需要重新登录。 从 Keychain 中检索是否比从 NSUserDefaults 检索更多,内存方面? 不要将 NSUserDefaults 用于任何需要至少安全的东西,因为安全项目将它们存储在钥匙串中。如果您有数据块,则对其进行加密并将密钥保存在钥匙串中。 WRT 时间成本我推荐给你:Donald Knuth“真正的问题是程序员在错误的地方和错误的时间花费了太多时间来担心效率;过早的优化是万恶之源(或至少大多数它)在编程中。”如果有性能问题配置文件找到它然后修复它。 【参考方案1】:

您要求“推荐”。推荐的做法是根本不存储密码。设计您的服务,使其接受该服务独有的访问令牌。您接受用户名和密码,服务器将访问令牌交还给您,您存储访问令牌,然后丢弃密码(可能还有用户名)。使用通用服务器和客户端框架的标准化方法是 OAuth。 (尽管 OAuth 的复杂性让我有点抓狂,但它确实是一个很好的协议,而且非常标准。)

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

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

【讨论】:

所以基本上你只需将明文密码存储在钥匙串中? 如果我必须存储密码,是的。这是最安全的地方。

以上是关于存储用户凭据 iOS 的推荐方式?的主要内容,如果未能解决你的问题,请参考以下文章

列出存储在用户凭据中的证书

在本地存储中存储用户凭据 |反应,还原

IBM 工作灯。是不是可以安全地存储用户凭据并在没有用户交互的情况下恢复它们?

网络凭证的用户名和密码在哪

如何将用户名和密码添加到 chrome 存储用户凭据的文件中?

MySQL / 存储 MySQL 凭据