在iOS上存储用户凭据的推荐方法?

在iOS上存储用户凭据的推荐方法?,ios,swift,nsuserdefaults,keychain,Ios,Swift,Nsuserdefaults,Keychain,我在我的应用程序中做了一个“记住我”的功能,我遇到了一个解决方案,您将所有凭证存储在Keychain中,而解决方案只将密码存储在Keychain中?我只想在身份验证时使用存储的密码,但是我更多地使用用户名,而不必从后端获取它,我可以从磁盘获取它。上述解决方案中的一个比另一个好吗 在进行身份验证时,如果使用拆分解决方案,我只需执行以下操作: let hasLoginKey = NSUserDefaults.standardUserDefaults().setBool(true, forKey: "

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

在进行身份验证时,如果使用拆分解决方案,我只需执行以下操作:

let hasLoginKey = NSUserDefaults.standardUserDefaults().setBool(true, forKey: "loginKey")
    NSUserDefaults.standardUserDefaults().setValue(username, forKey: "username")
您要求输入“推荐”。推荐的做法是根本不存储密码。设计您的服务,使其接受该服务独有的访问令牌。您接受用户名和密码,服务器返回一个访问令牌,您存储访问令牌,然后您扔掉密码(可能还有用户名)。OAuth是实现这一点的一种标准方法,它提供了通用的服务器和客户机框架。(虽然OAuth的复杂性让我有点疯狂,但它确实是一个很好的协议,而且非常标准。)

存储身份验证令牌的正确位置是钥匙链。正如Zaph所指出的,“双重加密”这个秘密不会给你带来任何好处,因为你现在有另一个秘密(加密密钥)要存储。你把它存放在哪里?如果您有一个更安全的地方来存储加密密钥,请将令牌放在那里。如果用一个硬编码的密钥对它进行一点模糊处理会让你感觉更好,那很好,但是安全性方面的好处很小


如果您不能按照推荐的方式设计服务,并且必须存储原始密码,则将其存储在keychain中。见上文。所有这些论点都适用。钥匙链是手机上最安全的地方。这并不意味着它是牢不可破的。这只是意味着它比任何其他地方都不容易损坏。

无论如何,如果你在keychain中存储,我认为即使用户删除应用程序,它也会持续,否则性能上没有实际差异,你不应该一直从磁盘上获取,只需获取一次,并在应用程序生命周期中将其作为属性使用。如果用户名是例如电子邮件地址,则应确保其安全。这取决于组织的安全审查。他们可能不喜欢不加密用户名。当您删除应用程序时,UserDefault将被删除,因为它位于沙盒内部,但keychain内容将保留,因为keychain将数据存储在沙盒外部。所以,当用户再次安装应用程序时,您将拥有他的密码而不是用户名(它是在UserDefault中)。你需要他再次登录。从内存角度看,我从Keychain检索的内容是否比从NSUserDefaults检索的内容多?对于需要最安全的内容,不要使用NSUserDefaults,因为安全的项目会将其存储在Keychain中。如果您有一个数据blob,则对其进行加密并将密钥保存在密钥链中。我指的是WRT时间成本:“真正的问题是程序员花了太多时间在错误的地方和错误的时间担心效率;过早优化是编程中所有罪恶(或至少大部分)的根源。”如果有一个性能问题配置文件来找到它,然后修复它。所以基本上你只需要在钥匙链中存储明文密码?如果我必须存储密码,是的。这是最安全的地方。