2016-04-23 59 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保存信息。