Android: сохранение имени пользователя и пароля?

178

Если я хочу сохранить имя пользователя и пароль для использования в приложении Android, каков наилучший способ сделать это? Это через экран настроек (но что, если пользователь пропустит это?), Или всплывающее диалоговое окно и запросить учетные данные пользователя? Если это так, я должен поддерживать состояние приложения. Как бы я это сделал?

легенда
источник
4
stackoverflow.com/a/786588/1166727 Узнайте, что об этом говорит @RetoMeier (технический лидер по разработке Android в Google).
Тони Гил
1
Если вы ищете самый безопасный способ хранения учетных данных.
Прочитайте
3
@ Легенда, как ты решил свою проблему?
Erum
@Legend, можете ли вы пролить свет на сохранение pwd в prefs после шифрования ... потому что я хочу, чтобы мое приложение работало без интернета, тогда как я могу получить ключ .. (потому что я не могу сохранить ключ на устройстве)
eRaisedToX
Вы можете использовать хранилище ключей для Api +18. developer.android.com/training/articles/keystore
Гольнар,

Ответы:

115

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

Совет от ( Android Dev Guide ):

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

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

Использование AccountManger - лучший вариант для хранения учетных данных. SampleSyncAdapter представляет собой пример того , как использовать его.

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

Эрик Левайн
источник
40
Я бы сказал, что рискованно сохранять информацию о пароле, как в настройках. На рутованных телефонах можно получить доступ к файлу настроек приложения. Минимум, что вы можете сделать, это запутать пароль.
Джаеш
51
Если у кого-то есть ваш телефон и он может получить root-права, вы не сможете сделать много для обеспечения безопасности ваших данных. Это не плохая идея, чтобы запутать пароль, но на самом деле это не добавляет гораздо большей защиты. Более важно то, что в ОС уже встроено много уровней безопасности. Конечно, вы не хотите делать глупостей, чтобы обойти эти меры. Вероятно, лучше использовать систему типа OAuth и хранить токен на устройстве вместо имени пользователя и пароля.
Эрик Левайн
4
Если вы используете AccountManager(согласно моему ответу и окольным путём @ Miguel), и кто-то завладеет вашим телефоном GSM, ему нужно будет продолжать использовать вашу SIM-карту для доступа к вашим учетным записям, так как это приведет к аннулированию сохраненных учетных данных. когда сменится симка.
Джон О
3
Удаление учетной записи при изменении SIP было удалено довольно давно, потому что это не имеет особого смысла, особенно для людей, которые имеют более одной SIM-карты. Лучшая стратегия в случае кражи телефона - перейти на страницу аккаунта Google и отозвать доступ для определенного устройства.
Николай Еленков
2
«Использование AccountManger - лучший вариант для хранения учетных данных». Зачем?
Люк
9

Вы должны использовать Android AccountManager . Это специально для этого сценария. Это немного громоздко, но одна из вещей, которые он делает, - делает недействительными локальные учетные данные при смене SIM-карты, поэтому, если кто-то проведет по телефону и вставит в него новую SIM-карту, ваши учетные данные не будут скомпрометированы.

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

SampleSyncAdapter (как упоминалось @Miguel) - это пример, который использует сохраненные учетные данные учетной записи.

Джон О
источник
3
Где документально подтверждено, что AccountManager будет «лишать законной силы локальные учетные данные в случае смены SIM-карты»?
Эрик Левайн
Это не то, что я знаю. Тем не менее, это то, во что я могу поверить / принять / понять после того, как у некоторых пользователей моего приложения возникли проблемы с аутентификацией после замены SIM-карты.
Джон О
1
Я не вижу этого в коде JavaDocs или AccountManager. Звучит как хорошая особенность, было бы неплохо проверить это и понять детали.
Эрик Левайн
2
По словам @NikolayElenkov, функция отмены аннулирования SIM-карты была удалена.
ThomasW
2
@ TommasW у вас есть цитата для этого? Было бы здорово получить окончательный ответ.
Джон О
8

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

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

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

Риз
источник
2
Можете ли вы опубликовать источник, который говорит, что account.db зашифрован? Или вы говорите, что конкретный пароль должен быть зашифрован?
Михал К
1
@Riz, где хранить ключ для шифрования ... потому что мое приложение работает без Интернета, поэтому не могу получить его из сети
eRaisedToX
2

С новым (Android 6.0) аппаратным обеспечением и API-интерфейсом для идентификации по отпечаткам пальцев вы можете сделать это, как в этом примере приложения github.

Златко
источник
8
Приведенный пример проекта создает ключ в Android Key Store и использует его для создания шифра для шифрования пароля. Зашифрованный пароль и шифр хранятся в виде строк в кодировке base64 в общих настройках. После успешной аутентификации по отпечатку пальца секретный ключ извлекается из Android Key Store и используется с декодированным шифром для расшифровки декодированного пароля.
mjwheat
@mjwheat, это очень полезно, чтобы понять, что происходит в примере. Спасибо! Одна маленькая опечатка: «... расшифровать зашифрованный пароль».
Muetzenflo
2

Они ранжируются по степени сложности, чтобы сломать вашу скрытую информацию .

  1. Хранить в открытом виде

  2. Хранить в зашифрованном виде с помощью симметричного ключа

  3. Использование Android Keystore

  4. Хранить в зашифрованном виде с использованием асимметричных ключей

источник: где лучше всего хранить пароль в вашем приложении для Android

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

источник: просто используйте Android Keystore для хранения паролей и другой конфиденциальной информации

Дмитрий Мельничук
источник
1

Информация на http://nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.html - это довольно прагматичный, но основанный на использовании «and-hidden-android-apis» подход. Это то, что нужно учитывать, когда вы действительно не можете обойтись хранением учетных данных / паролей локально на устройстве.

Я также разработал суть этой идеи на https://gist.github.com/kbsriram/5503519, которая может оказаться полезной.

KBS
источник