在设备

时间:2015-08-04 15:32:45

标签: android ios security xamarin sharedpreferences

我第一次使用身份验证,我必须在本地数据库中保存用户名,我还应该保存密码和会话ID,我从服务器获取此信息。

因此,我需要选择安全保存此信息的最佳方式。我在某处找到了一些建议SharedPreferences和其他客户经理的文章。

那么,你能说明哪种方式最适合这种情况吗?

2 个答案:

答案 0 :(得分:2)

不要像其他人一样使用NSUserDefaultsSharedPreferences,因为它们以纯文本格式存储信息。由于在考虑敏感数据中的密码信息,首先加密它。

对于iOS,请使用KeyChain。这个包装有助于:

UICKeyChainStore

对于Android使用

secure-preferences

*注意:为了进一步备份我的陈述,众所周知,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:最好不要将敏感数据存储为纯文本。但这绝对是最简单的方式。