Android 在设备中保存凭据的最佳方法

Android 在设备中保存凭据的最佳方法,android,ios,security,xamarin,sharedpreferences,Android,Ios,Security,Xamarin,Sharedpreferences,我是第一次使用身份验证,我必须在本地数据库中保存用户名,我还应该保存密码和会话id,我从服务器上获取这些信息 所以,我需要选择安全保存此信息的最佳方式。我在某个地方读过一些文章,建议是SharedReferences和其他客户经理 那么,您能否指定哪种方式最适合这种情况 在Android上,SharedReferences是一种很好的方法,非常简单。但是一个友好的提醒这不是最安全的方法,但可能是最简单的方法。如果设备是根设备,并且数据以键值的方式以纯文本存储,则用户可以访问该文件 您可以尝试对该

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

所以,我需要选择安全保存此信息的最佳方式。我在某个地方读过一些文章,建议是
SharedReferences
和其他客户经理


那么,您能否指定哪种方式最适合这种情况

在Android上,
SharedReferences
是一种很好的方法,非常简单。但是一个友好的提醒这不是最安全的方法,但可能是最简单的方法。如果设备是根设备,并且数据以
键值
的方式以纯文本存储,则用户可以访问该文件

您可以尝试对该数据使用一些加密,或者尝试找到一个包装器来处理该数据,就像在其他答案中建议的那样。iOS还应该有其他包装器或方法

你也可以使用谷歌提供的解决方案。这已经在这里讨论过了

你也可以尝试改变你在你的服务器上验证用户的方式,这是一个建议,就像Twitter一样

但是,如果您喜欢使用
SharedReferences
,下面还有更多内容

您可以阅读有关
SharedReferences
的更多信息。您可以访问这些文档

例如:

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:最好不要将敏感数据存储为纯文本。但这绝对是最简单的方法。

不要像其他人建议的那样使用
NSUserDefaults
SharedReferences
,因为它们以纯文本形式存储信息。由于密码信息被认为是敏感数据,因此首先对其进行加密

对于iOS,使用钥匙链。此包装有助于:

供Android使用


*注意:为了进一步支持我的声明,众所周知苹果拒绝使用纯文本存储敏感数据的应用程序,因此请在iOS中使用加密

,你应该考虑将它们存储在中。你说的“帐户管理器”是指安卓.accounts.AccountManager?它现在需要我这边做更多的更改,不是吗?关于
AccountManager
谢谢@Mauker。这里有一个有趣的点,它不需要在设置中添加帐户,我的意思是,在这种特殊情况下,凭据只有技术意义和用法。听起来不错,因为我看到它是android的自定义库(安全首选项),我有xamarin项目,所以如果我加密密码而不是保存在共享首选项中并解密回来,得到了同样的结果,对吗?