我正在尝试创建一个简单的应用程序,该应用程序连接到邮件服务器并定期检索电子邮件。我已经阅读了有关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这样的邮件服务器,我们每次与它们交谈时都需要提供用户名和密码,并且身份验证令牌的用途有限。
有没有办法安全地存储此方案的用户名和密码?
请注意,默认情况下,AccountManager
不受任何加密方法的保护。那里的密码以纯文本形式存储。
通常,将敏感数据本地存储在 Android 设备上始终存在泄露的风险。但是,有一些选项可以通过使黑客更难提取应用程序的敏感数据来降低风险。加密数据后,一个常见问题是您需要一种方法来隐藏加密密钥。Android的Keystore
系统可以帮助解决这个问题。
Android 密钥库系统允许您将私钥存储在容器中 使从设备中提取更加困难。一旦钥匙进入 密钥库,它们可用于加密操作与 私钥材料仍然不可导出。
我建议查看Ophio的安全首选项库。该库提供了一个抽象,用于在将数据存储在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
中的信息的更多信息,请查看本文。