2011-11-02 44 views
15

在设备上保存用户名和密码的最佳做法是什么?Android - 我们应该在设备内存中保存用户名和密码?

我已经经历了很多Stackoverflow的答案,现在我有点困惑。

我正在开发一个电子邮件应用程序,我希望我的用户在使用它时感到绝对安全。

有些人建议我们加密它并保存在SharedPreference中。有人建议我们不应该将其保存在设备上。

我只想将用户的详细信息存储在最安全的地方。

任何帮助,建议将不胜感激。

谢谢。

回答

17

您应该使用AbstractAccountAuthenticator类保存用户凭据。这不仅是超级安全的,它也让你的应用感觉与android更加融合。你有没有去过Android设置中的“账户”屏幕,并在那里看到你的Facebook,Twitter和GMail账户?这是因为他们使用了AccountAuthenticator。此外,它允许您将URI/ContentProvider与特定的用户帐户相关联。要看到一个非常全面(但很复杂)的例子,请查看SampleSyncAdapter示例。

+0

感谢这个精彩的建议。我现在正在尝试。 :)我会让你知道,如果我将面临任何麻烦,而应用这种技术。再次感谢。 – Varundroid

-3

SharedPreference是最好的选择。

  1. 易于使用
  2. 只有当用户的应用程序
  3. 灵活性清除数据时,用户使用另一组登录凭证更改值删除。

下面介绍如何做到这一点。

import android.preference.PreferenceManager; 

private static final String LOGIN_EMAIL = "login_email"; 
private static SharedPreferences mAppPreferences; 
private static SharedPreferences.Editor mEditor; 

/*Insert your code to Get user entry of email from the EditText*/ 

mAppPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
mEditor = mAppPreferences.edit(); 
mEditor.putString(LOGIN_EMAIL, v_user_email); 
mEditor.commit(); 

我不认为SharedPreference存储是不安全的或者可能被篡改。

+1

有趣的是,如果你使用类似ACRA的东西来为你做异常日志记录,它会在崩溃时将所有用户共享的prefs转储出去,所以密码就暴露在那里......有趣的事情。 – topwik

+0

@towpse你可以转储所有你想要的,但你永远不能使用该密码登录到应用程序。 – Aakash

+2

取决于应用程序不是吗? – topwik

1

你有任何控制服务器端,或者这是一个通用的电子邮件客户端?如果你可以控制服务器端,我会做一些验证,然后让服务器生成一个UUID,并保留在未来的api调用本地。另一个想法是将密码的哈希值发送给API调用,而不是实际的密码,然后您可以在本地存储密码哈希值。

加密用户名/密码的问题是您的代码需要能够解密它,并且如果您的代码可以解密它,有人可以逆向工程化您的代码并且也可以这样做,尽管您可以使它更容易/更难以编码和打包它。

一旦你弄清楚你正在存储什么,你可以找出你如何存储它。一个帐户?共享首选项。多个帐户?创建一个Sqlite数据库。

我建议使用http://ormlite.com/来处理你的数据库连接。我做了很多最初的Android端口工作,现在它已经被顶尖的黑客组织加强/维护。非常稳固的东西。

查看更多SQLite的博客文章:

http://www.touchlab.co/blog/single-sqlite-connection/ http://www.touchlab.co/blog/android-sqlite-locking/

1

如果担心安全问题,最终仍然归结为以加密形式保存用户凭据。以下是一些建议:

  1. 考虑使用Base64加密凭证。

  2. 加密密钥应该分成不同的部分并保存在应用程序的不同部分。只能由应用程序逻辑组合。

  3. 考虑使用JNI来加密部分代码。

  4. 一旦你有一个加密逻辑,你应该使用AbstractAccountAuthenticator。

记住两件事: a。 apk可以被反编译来检索密钥。 (这就是为什么(2)和(3))。 b。保存纯文本是灾难性的。 (这就是为什么(1))。

再次想到,一旦你有了1,2和3,你也可以使用SharedPreferences。

相关问题