我第一次使用身份验证,我必须在本地数据库中保存用户名,我还应该保存密码和会话ID,我从服务器获取此信息。
因此,我需要选择安全保存此信息的最佳方式。我在某处找到了一些建议SharedPreferences
和其他客户经理的文章。
那么,你能说明哪种方式最适合这种情况吗?
答案 0 :(得分:2)
不要像其他人一样使用NSUserDefaults
或SharedPreferences
,因为它们以纯文本格式存储信息。由于在考虑敏感数据中的密码信息,首先加密它。
对于iOS,请使用KeyChain。这个包装有助于:
对于Android使用
*注意:为了进一步备份我的陈述,众所周知,Apple拒绝以纯文本格式存储敏感数据的应用程序,因此请使用加密
答案 1 :(得分:0)
在Android上,SharedPreferences
是一种很好的方法,它非常简单。但友情提醒...... 这不是最安全的方式但它可能是最简单的方法。如果设备已植根,则用户可以访问该文件,并且数据以Key-Value
方式以纯文本格式存储。
您可以尝试对该数据使用某种加密,或者尝试找到一个包装来处理该数据,就像在其他答案中建议的SecurePreferences
一样。 iOS也应该有其他包装器或方法。
您还可以使用Google提供的AccountManager
解决方案。这已经在this question上讨论过了。
您还可以尝试更改服务器上用户身份验证的方式,建议使用OAuth
,就像Twitter一样。
但是,如果你想使用SharedPreferences
,那么下面会有更多内容。
您可以阅读有关SharedPreferences
here的更多信息。您可以访问文档here。
一个例子:
public class SessionManager {
private static SessionManager instance = null;
private SharedPreferences sharedPref;
private Editor editor;
private final String prefName = "session";
public static SessionManager getInstance() {
if (instance == null) {
instance = new SessionManager();
}
return instance;
}
private SessionManager() {
sharedPref = context_.getSharedPreferences(prefName,Context.MODE_PRIVATE);
}
public void saveUser(String username, String password, int sid) {
if (TextUtils.isEmpty(username) && TextUtils.isEmpty(password) && sid > 0) {
editor = sharedPref.edit();
editor.putInt("session_id",sid);
editor.putString("username", username);
editor.putString("password",password);
editor.commit();
}
}
public String getUsername() {
return sharedPref.getString("username",null);
}
// Declare other methods to fetch the rest of the data.
}
TL; DR:最好不要将敏感数据存储为纯文本。但这绝对是最简单的方式。