如何在android中存储用户/密码?

时间:2016-04-23 14:01:49

标签: android pop3 accountmanager activesync android-security

我正在尝试创建一个连接到邮件服务器并定期检索电子邮件的简单应用程序。我已经阅读了有关AccountManager(http://developer.android.com/reference/android/.../AccountManager.html)和一篇关于如何编写类似内容(http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/)的优秀文章。

据我了解,此解决方案提供了一种处理服务器返回的身份验证令牌的方法。但是,对于POP3和Exchange Active Sync等邮件服务器,我们每次与它们交谈时都需要提供用户名和密码,而身份验证令牌的用途有限。

有没有办法安全存储此方案的用户名和密码?

1 个答案:

答案 0 :(得分:1)

请注意,默认情况下,AccountManager不受任何加密方法的保护。那里的密码以纯文本形式存储。

通常,在Android设备上本地存储敏感数据始终存在受到威胁的风险。但是,有一些选项可以通过使黑客更难以提取应用程序的敏感数据来降低风险。一旦加密了数据,一个常见的问题就是您需要一种方法来隐藏加密密钥。 Android的Keystore系统可以提供帮助。

  

Android Keystore系统允许您将私钥存储在容器中   使设备中的提取更加困难。一旦钥匙进入   密钥库,它们可以用于加密操作   私钥材料仍然不可出口。

我建议查看Ophio的Secure-Preferences库。该库提供了一种抽象,可以在将数据存储到SharedPreferences之前对其进行模糊处理,并使用KeyStoreKeyGenerator来加密您的加密密钥。在本地保存用户密码可能如下所示:

private static void stashPassword(Application application, String password) {
    String secretKey = null;
    try {
        secretKey = KeyStoreKeyGenerator.get(application, "KeyFilename")
                        .loadOrGenerateKeys();
    } catch (Exception exception) {
        // handle error
    }

    SharedPreferences preferences = new ObscuredPreferencesBuilder()
            .setApplication(application)
            .obfuscateValue(true)
            .obfuscateKey(true)
            .setSharePrefFileName(PREFERENCES_NAME)
            .setSecret(secretKey)
            .createSharedPrefs();
    preferences.edit().putString(KEY_PASSWORD, password).apply();
}

有关保护SharedPreferences中保存的信息的详细信息,请查看this article