2016-04-23 20 views
0

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

在我的理解中,此解决方案提供了一种方法来处理由服务器返回的身份验证令牌。但是,对于像POP3和Exchange Active Sync这样的邮件服务器,我们需要在每次与他们交谈时提供用户名和密码,并且auth令牌的用途有限。

有没有一种方法可以安全地存储此场景的用户名和密码?

+0

在本地数据库中存储用户名和密码的最佳方式,存储密码已加密。 –

回答

1

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

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

Android Keystore系统允许您将私钥存储在容器 中,以便从设备中提取更加困难。一旦密钥在 密钥库中,它们可以用于加密操作,并且 私钥资料保持不可导出。

我建议查看Ophio的Secure-Preferences库。该库在将数据存储在SharedPreferencesKeyStoreKeyGenerator之前提供了一个抽象模糊处理,用于加密您的加密密钥。保存用户的密码在本地可能是这个样子:

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(); 
} 

看看this article的详细信息,确保您在SharedPreferences保存信息。