Android. Где мы должны сохранять имя пользователя и пароль в памяти устройства?

Какова хорошая практика для сохранения имени пользователя и пароля на устройстве?

Я прошел много ответов на Stackoverflow, и теперь я немного смущен.

Я работаю над приложением электронной почты, и я хочу, чтобы мой пользователь чувствовал себя абсолютно безопасным при его использовании.

Некоторые люди предполагают, что мы должны зашифровать его и сохранить в SharedPreference. Некоторые полагают, что мы не должны сохранять его на устройстве вообще.

Я хочу, чтобы данные пользователя были сохранены в наиболее безопасном месте.

Любая помощь, предложения будут высоко оценены.

Спасибо.

Ответы

Ответ 1

Вы должны сохранить учетные данные пользователей, используя класс AbstractAccountAuthenticator. Это не только безопасно, но и делает ваше приложение более интегрированным с Android. Вы когда-нибудь заходили на экран "Учетные записи" в настройках Android и видели ваши учетные записи на Facebook, Twitter и GMail? Это потому, что они используют AccountAuthenticator. Кроме того, он позволяет связать URI/ContentProviders с конкретными учетными записями пользователей. Чтобы увидеть действительно всеобъемлющий (но сложный) пример всего этого, просмотрите пример SampleSyncAdapter.

Ответ 2

Есть ли у вас какой-либо контроль над серверной стороной или это общий почтовый клиент? Если вы можете контролировать серверную часть, я бы сделал что-то вроде аутентификации, а затем создал сервер UUID и сохранил его локально для будущих вызовов api. Другая идея заключалась бы в том, чтобы отправить хэш пароля на вызовы api вместо фактического пароля, тогда вы можете локально хранить хэширование пароля.

Проблема с шифрованием имени пользователя/пароля заключается в том, что ваш код должен быть способен расшифровать его, и если ваш код может его расшифровать, кто-то может переделать ваш код и сделать это, хотя вы можете сделать это проще/сложнее, как вы его кодируете и упаковываете.

Как только вы выясните, что вы храните, вы можете выяснить, как вы его храните. Один аккаунт? Общие префы. Несколько учетных записей? Создайте Sqlite DB.

Я бы предложил использовать http://ormlite.com/ для обработки ваших соединений с db. Я сделал хороший кусок начального порта Android, и теперь его улучшали/поддерживали ведущие группы хакеров. Очень прочный материал.

Смотреть больше сообщений в блоге Sqlite:

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

Ответ 3

Если безопасность является проблемой, в конечном итоге она все еще сводится к сохранению учетных данных пользователя в зашифрованном виде. Вот несколько советов:

  • Рассмотрим шифрование учетных данных с помощью Base64.

  • Ключ шифрования должен быть разделен на несколько частей и сохранен в разных частях приложения. Только для объединения с логикой приложения.

  • Рассмотрим использование JNI для части шифрования кода.

  • Когда у вас есть логика шифрования, вы должны использовать AbstractAccountAuthenticator.

Помните две вещи: а. Apk можно декомпилировать для извлечения ключа. (Вот почему (2) и (3)). б. Сохранение простого текста является катастрофическим. (Вот почему (1)).

Во-вторых, если у вас есть 1, 2 и 3 места, вы также можете использовать SharedPreferences.

Ответ 4

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 небезопасно или может быть изменено.