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