2013-10-28 8 views
9

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

ответ

35

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

В корневых систем, уполномоченные приложения будут иметь доступ к внутренней системы хранения/системы раздела, таким образом, доступ к корневому собственности файлы зашифрованного XML, где Android хранит SharedPreferences, КОТОРАЯ СТАНЕТ ClearText ДЛЯ ROOT-УПОЛНОМОЧЕННЫЙ APPS. Поэтому, если у компрометированного телефона есть приложение, в котором хранятся такие данные, и у пользователя есть привычка злоупотреблять одним и тем же адресом электронной почты/паролем для разных служб, вектор атаки довольно прост, чтобы скомпрометировать учетные данные для нескольких служб, несмотря на любые предупреждения, которые пользователь уволил, когда укореняя его телефон или предоставляя приложению такие разрешения, потому что, ну, те предупреждения просто недостаточно ясны.

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

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

+6

Я бы сказал, что «SharedPreferences» - это хорошее место для начала. Шифрование их обязательно **, если приложение будет опубликовано **. –

+1

Когда вы работаете с паролями, лучшее место для начала - это наименее подверженное ошибкам место, которое вы знаете. Android не предоставляет из коробки SharedPreferences шифрование, а также возможность их шифрования. Поэтому я говорю, что лучшее место для начала не может быть местом, которое по какой-то причине может оказаться в финальной версии. У меня была аналогичная проблема, и в итоге я использовал SecurePreferences https://github.com/scottyab/secure-preferences – leRobot

+0

ОК, в моем случае я разрабатываю внутреннее корпоративное приложение, которое будет установлено в нескольких таблицах, которые у нас есть. , Поскольку у меня есть требование хранить учетные данные, я считаю более правильным начать с его базовой реализации. Шифрование их будет включено в дорожную карту для следующих версий. Никто здесь не возьмет устройства и не запустит их, чтобы увидеть другие пароли :-) –

-1

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

Я думаю, что его гораздо яснее ... :)

+0

Извините, но что я должен делать с этим? могли бы вы объяснить? –

+1

Да, теперь это намного яснее. –

+0

Итак, где я снова использую эти методы? –

-1

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

@FranklySpeaking: Я рассказываю вам, как можно хранить данные локально в предпочтении. Вы также можете сохранить свои учетные данные в Google App Engine из предпочтений. Проверьте это https://developers.google.com/appengine/docs/ –

Смежные вопросы