在设备中保存凭据的最佳方法[关闭]

Posted

技术标签:

【中文标题】在设备中保存凭据的最佳方法[关闭]【英文标题】:Best way to save credentials in device [closed] 【发布时间】:2015-08-04 15:32:44 【问题描述】:

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

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

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

【问题讨论】:

ios 中,您应该考虑将它们存储在 Keychain 中。 说“客户经理”是指android.accounts.AccountManager吗? 我现在需要更多的改变,不是吗? 关于AccountManager***.com/questions/2720315/… 感谢@Mauker。这里有一个有趣的点,它不需要在设置中添加帐户,我的意思是这种特殊情况下的凭据仅具有技术意义和用法。 【参考方案1】:

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

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

UICKeyChainStore

安卓使用

secure-preferences

*注意:为了进一步支持我的陈述,众所周知,Apple 拒绝以纯文本形式存储敏感数据的应用程序,因此请使用加密

【讨论】:

听起来不错,因为我看到它是 android (security-preferences) 的自定义库,我有 xamarin 项目,所以如果我加密密码而不是保存在共享首选项中并解密回来,得到相同的结果,对吗?【参考方案2】:

在 Android 上,SharedPreferences 是一个很好的方法,它非常简单。但友情提醒... 这不是最安全的方法,但它可能是最简单的方法。如果设备已获得 root 权限,则用户可以访问该文件,并且数据以 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:最好不要将敏感数据存储为纯文本。但这绝对是最简单的方法。

【讨论】:

以上是关于在设备中保存凭据的最佳方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 设备中保存从 Web 下载的图像的最佳位置?

桌面 -> 移动设备的最佳方法?

大型数据库 - 在设备上显示数据的最佳方式?

如何在 Android 中保存数据

并行处理传入数据的最佳方法? (Java/Groovy)

从移动设备到服务器的强大文件传输[关闭]