Лучшее место для хранения учетных данных пользователя в Android

Я создаю приложение для Android, и я не могу (?) Найти любую информацию об аутентификации пользователя приложения в Google App Engine (без использования учетной записи Google пользователя). Хорошая практика – хранить имя пользователя и пароль на устройстве Android и Затем сохраните данные, используемые приложением в Google App Engine?

Вы не должны использовать SharedPreferences , несмотря на то, насколько безопасный Google расскажет вам об этом, поскольку тот факт, что привычки укоренения широко распространены как силовыми, так и потенциальными пользователями.

В корневых системах авторизованные приложения смогут получить доступ к внутреннему хранилищу / системному разделу, таким образом, получить доступ к зашифрованным XML-файлам root, в которых Android хранит SharedPreferences, WHICH BECOME CLEARTEXT для ROOT-AUTHORIZED APPS . Поэтому, если у компрометированного телефона есть приложение, в котором хранятся такие данные, и у пользователя есть привычка злоупотреблять одним и тем же адресом электронной почты / паролем для разных служб, вектор атаки довольно прост, чтобы скомпрометировать учетные данные для нескольких служб, несмотря на любые предупреждения, которые пользователь уволил, когда Укореняя его телефон или предоставляя приложению такие разрешения, потому что, ну, эти предупреждения просто недостаточно ясны .

Альтернативами являются ручное шифрование постоянного хранилища для учетных данных с использованием пользовательских, переменных семян, соленых алгоритмов. Secure-preferences lib – отличная альтернатива, которая в значительной степени делает все для вас прозрачным способом, с дополнительным преимуществом внедрения интерфейса SharedPreferences от Android, сохраняя большую часть функциональных возможностей spref по умолчанию с незначительной настройкой (посмотрите на их образцы).

2016 Редактировать: Я просто чувствовал, что мне нужно вернуться к этому вопросу в 2016 году и добавить хорошую ссылку на драму Apple против FBI, чтобы изменить ОС на телефоне Сан-Бернардино. Итак, представьте, что у вас есть телефон, который легко поддается восстановлению, как и большинство Android, и даже может быть укоренен по умолчанию или не нужно протирать данные до корня. ФБР не требует ничего от Google или вашей компании, если они не получат ваши учетные данные. Используя такие вещи, как безопасные предпочтения , вы устанавливаете тот же тип ответственности, который Apple решила предпринять, только сделав свою собственную систему (в данном случае, ваше приложение) доступной для этих учетных данных. Вас это раздражает ФБР, если они этого желают, но давая вашим пользователям ощущение, что вы, а не базовая ОС, являетесь единственным органом, имеющим прямой контроль над этими учетными данными, – это то, что я предпочел бы иметь в своем продукте.

Рассмотрим 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); 

Я думаю, теперь его гораздо яснее … 🙂

Вы можете сохранить учетные данные пользователя в общих предпочтениях. Вы можете использовать это значение предпочтения при любом из ваших действий. Сохраненное значение останется даже после выхода из приложения. Пример кода для общих настроек приведен здесь. Рекомендуется сохранить ваш код предпочтений в вашем классе 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", ""); }