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

Posted

技术标签:

【中文标题】Android - 我们应该将用户名和密码保存在设备内存中的啥位置?【英文标题】:Android - Where should we save username and password in device memory?Android - 我们应该将用户名和密码保存在设备内存中的什么位置? 【发布时间】:2011-12-20 14:16:10 【问题描述】:

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

我在 *** 上看过很多答案,现在我有点困惑。

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

有人建议我们应该加密保存在SharedPreference。有人建议我们根本不应该将其保存在设备上。

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

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

【问题讨论】:

【参考方案1】:

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

    考虑使用 Base64 加密凭据。

    加密密钥应该分成不同的部分,保存在应用程序的不同部分。只能通过应用逻辑组合。

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

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

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

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

【讨论】:

Base64 是一种编码而非加密。它可以在没有私钥的情况下反转。【参考方案2】:

您是否可以控制服务器端,或者这是一个通用的电子邮件客户端?如果您可以控制服务器端,我会做一些类似身份验证的操作,然后让服务器生成一个 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/

【讨论】:

【参考方案3】:

SharedPreference 是最佳选择。

    易于使用 仅在用户清除应用数据时删除 在用户使用另一组登录凭据时更改值的灵活性。

你可以这样做。

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

【讨论】:

有趣的是,如果你使用 ACRA 之类的东西来为你做异常记录,它会在崩溃时转储所有用户共享的首选项,所以密码就会在那里暴露出来。 . 有趣的。 @towpse 您可以转储您想要的所有内容,但您永远不能使用该密码登录应用程序。 这取决于应用不是吗?【参考方案4】:

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

【讨论】:

以上是关于Android - 我们应该将用户名和密码保存在设备内存中的啥位置?的主要内容,如果未能解决你的问题,请参考以下文章

Android——用户登陆及用户名和密码的保存

如何在 Webview 中保存用户名和密码

如何在 Android App 中保存最后输入的编辑文本值?

16:跳过密码保存,因为可能会提示用户使用 Android Autofill

如何保存android应用程序的登录详细信息?

如何保存数据库用户名和密码Spring boot项目[重复]