Android - где мы должны сохранить имя пользователя и пароль в памяти устройства? - PullRequest
15 голосов
/ 02 ноября 2011

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

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

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

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

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

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

Спасибо.

Ответы [ 4 ]

17 голосов
/ 02 ноября 2011

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

1 голос
/ 09 августа 2013

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

  1. Рассмотрите возможность шифрования учетных данных с использованием Base64.

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

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

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

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

Если подумать, если у вас есть 1, 2 и 3, вы можете использовать SharedPreferences.

1 голос
/ 02 ноября 2011

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

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

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

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

Другие сообщения в блоге Sqlite:

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

0 голосов
/ 02 ноября 2011

SharedPreference - лучший вариант.

  1. Простота использования
  2. Удаляется только тогда, когда пользователь очищает данные для приложения
  3. Гибкость для изменения значений, когда пользователь использует другой набор учетных данных.

Вот как вы можете это сделать.

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

...