在Android中存储用户login凭据的最佳位置

我正在创build一个Android应用程序,我无法find关于在Google App Engine上validation应用程序用户的任何信息(不使用用户的Google帐户)。在Android设备上存储用户名和密码是一种很好的做法,然后将应用程序使用的数据存储在Google App Engine上?

Solutions Collecting From Web of "在Android中存储用户login凭据的最佳位置"

你不应该使用SharedPreferences ,尽pipe谷歌会告诉你他们是安全的,简单的事实是,生根习惯是权力和无限权力用户普遍使用的。

在有根系统中,授权应用程序将能够访问内部存储/系统分区,从而访问Android存储SharedPreferences的根encryptionXML文件,这些文件将成为ROOT-AUTHORIZED APPS的CLEARTEXT 。 因此,如果受到攻击的手机碰巧有一个存储此类数据的应用程序,并且用户习惯于滥用相同的电子邮件/密码以用于不同的服务,则攻击媒介非常简单,可以妥协多个服务的凭据,尽pipe用户在解除任何警告根植他的电话或给应用程序这样的权限,因为,那些警告只是不够清楚

替代方法是手动encryption持久性存储凭证,使用自定义,可变种子,盐渍algorithm。 secure-preferences lib是一个很好的select,它以透明的方式为你做了很多事情,还有实现Android的SharedPreferences接口的额外好处,保留了默认sprefs的大部分function,并且进行了小小的调整(查看他们的示例)。

2016编辑:我只是觉得我需要在2016年回到这个问题,并添加一个很好的参考苹果与FBI戏剧改变在圣贝纳迪诺攻击手机的操作系统。 所以,想象一下,像大多数Android手机一样,手机很容易获得root权限,甚至可以根据默认设置,或者不需要将数据擦除到root。 如果联邦调查局不想获得您的证书,那么您无需向Google或您的公司索要任何资料。 通过使用诸如安全首选项之类的东西,您可以将苹果决定采取的相同types的责任放在自己的系统上(在这种情况下,您的应用程序)能够访问这些凭据。 如果他们愿意的话,你肯定会被联邦调查局打扰,但是让用户觉得你而不是底层操作系统是唯一可以直接控制这些证书的权威,这是我宁愿在我的产品中拥有的东西。

您可以将用户凭据保存为共享首选项。 您可以在任何活动中使用此首选项值。 即使退出应用程序,保存的值仍将保留。 共享偏好的示例代码在这里。 build议将您的首选项代码保存在您的应用程序utils类中,以保持您的代码的组织。

  public static String KEY = "SESSION"; public static void saveUserName(String userid, Context context) { Editor editor = context .getSharedPreferences(KEY, Activity.MODE_PRIVATE).edit(); editor.putString("username", userid); editor.commit(); } public static String getUserName(Context context) { SharedPreferences savedSession = context.getSharedPreferences(KEY, Activity.MODE_PRIVATE); return savedSession.getString("username", ""); } 

考虑SharedPreferences这个,比如…

 public class PrefUtils { public static final String PREFS_LOGIN_USERNAME_KEY = "__USERNAME__" ; public static final String PREFS_LOGIN_PASSWORD_KEY = "__PASSWORD__" ; /** * Called to save supplied value in shared preferences against given key. * @param context Context of caller activity * @param key Key of value to save against * @param value Value to save */ public static void saveToPrefs(Context context, String key, String value) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); final SharedPreferences.Editor editor = prefs.edit(); editor.putString(key,value); editor.commit(); } /** * Called to retrieve required value from shared preferences, identified by given key. * Default value will be returned of no value found or error occurred. * @param context Context of caller activity * @param key Key to find value against * @param defaultValue Value to return if no data found against given key * @return Return the value found against given key, default if not found or any error occurs */ public static String getFromPrefs(Context context, String key, String defaultValue) { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); try { return sharedPrefs.getString(key, defaultValue); } catch (Exception e) { e.printStackTrace(); return defaultValue; } } } 

简单地使用这些方法,

 // Saving user credentials on successful login case PrefUtils.saveToPrefs(YourActivity.this, PREFS_LOGIN_USERNAME_KEY, username); PrefUtils.saveToPrefs(YourActivity.this, PREFS_LOGIN_PASSWORD_KEY, password); // To retrieve values back String loggedInUserName = PrefUtils.getFromPrefs(YourActivity.this, PREFS_LOGIN_USERNAME_KEY); String loggedInUserPassword = PrefUtils.getFromPrefs(YourActivity.this, PREFS_LOGIN_PASSWORD_KEY); 

我觉得它现在更清晰了… 🙂