Android - 我们应该在设备内存中保存用户名和密码?

时间:2011-11-02 18:31:53

标签: android passwords store username

在设备上保存用户名和密码的好习惯是什么?

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

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

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

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

任何帮助,建议都将受到高度赞赏。

感谢。

4 个答案:

答案 0 :(得分:17)

您应该使用AbstractAccountAuthenticator课程保存用户凭据。这不仅是超级安全,它还使您的应用程序感觉与Android更加集成。您是否曾在Android设置中进入“帐户”屏幕并在那里看到了您的Facebook,Twitter和GMail帐户?那是因为他们使用的是AccountAuthenticator。此外,它允许您将URI / ContentProviders与特定用户帐户相关联。要查看所有这些的真正全面(但复杂)的示例,请查看SampleSyncAdapter示例。

答案 1 :(得分:1)

您是否对服务器端有任何控制权,或者这是一个通用的电子邮件客户端?如果您可以控制服务器端,我会执行类似身份验证的操作,然后让服务器生成UUID并将其保存在本地以用于将来的api调用。另一个想法是将密码的散列发送到api调用而不是实际密码,然后您可以在本地存储密码散列。

加密用户名/密码的问题在于您的代码需要能够对其进行解密,如果您的代码可以对其进行解密,则有人可以对代码进行反向工程并执行此操作,尽管您可以更轻松地/如何编码和打包它会更难。

一旦你弄明白你要存储什么,你就可以弄明白你如何存储它。一个账号?共享首选项。多账户?创建一个Sqlite DB。

我建议使用http://ormlite.com/来处理数据库连接。我做了很多初始Android端口工作,现在由一群顶级黑客加强/维护。非常坚固的东西。

查看更多Sqlite博客文章:

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

答案 2 :(得分:1)

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

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

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

  3. 考虑将JNI用于代码的加密部分。

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

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

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

答案 3 :(得分:-3)

SharedPreference是最佳选择。

  1. 易用性
  2. 仅在用户清除App的数据时删除
  3. 当用户使用另一组登录凭据时,可以灵活地更改值。
  4. 以下是如何做到这一点。

    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存储不安全或可能被篡改。