我正在我的应用程序中执行“记住我”功能,我遇到了解决方案,您将所有凭据存储在Keychain和解决方案中,您只需将密码存储在Keychain中?存储的密码我只想在验证时使用,但是我使用的用户名更多,而不是从后端获取它,我可以从磁盘上获取它。提到的解决方案之一是否优于其他解决方案?
经过身份验证我就是这样做的,如果我选择拆分解决方案:
let hasLoginKey = NSUserDefaults.standardUserDefaults().setBool(true, forKey: "loginKey")
NSUserDefaults.standardUserDefaults().setValue(username, forKey: "username")
答案 0 :(得分:12)
您要求“推荐”。建议的做法是根本不存储密码。设计您的服务,使其接受该服务特有的访问令牌。您接受用户名和密码,服务器将您提供访问令牌,存储访问令牌,然后丢弃密码(可能还有用户名)。 OAuth是一种标准化的方法,可以使用通用的服务器和客户端框架。 (就像OAuth因为其复杂性而让我有点疯狂,它确实是一个很好的协议,而且非常标准。)
存储身份验证令牌的正确位置是钥匙串。正如Zaph指出的那样,“双重加密”这个秘密不会给你任何东西,因为你现在有另一个秘密(加密密钥)来存储。你在哪里存储?如果您有一个更安全的地方来存储加密密钥,请将令牌放在那里。如果使用硬编码密钥让你感觉更好一点,那就好了,但安全性的好处很小。
如果您无法以推荐的方式设计服务,并且必须存储原始密码,请将其存储在钥匙串中。往上看。所有相同的论点都适用。钥匙扣是手机上最安全的地方。这并不意味着它是牢不可破的。它只是意味着它比你存储东西的任何其他地方更不容易破解。