В общем, SharedPreferences - ваш лучший выбор для хранения настроек, поэтому в целом я бы рекомендовал этот подход для сохранения настроек приложения и пользователя.
Единственная проблемная область - это то, что вы экономите. Пароли всегда сложнее хранить, и я бы особенно остерегался хранить их в виде открытого текста. Архитектура Android такова, что SharedPreferences вашего приложения находятся в «песочнице», чтобы другие приложения не могли получить доступ к значениям, поэтому существует некоторая безопасность, но физический доступ к телефону потенциально может предоставить доступ к значениям.
Если возможно, я бы хотел изменить сервер для использования согласованного токена для предоставления доступа, что-то вроде OAuth . В качестве альтернативы вам может понадобиться создать своего рода криптографическое хранилище, хотя это нетривиально. По крайней мере, убедитесь, что вы шифруете пароль перед записью его на диск.
MODE_PRIVATE
с SharedPreferences эквивалентно аналогичным действиям с файлом, созданным во внутреннем хранилище, с точки зрения эффективности для обфускации локально хранимых данных?Я согласен с Reto и fiXedd. Объективно говоря, не имеет смысла вкладывать много времени и усилий в шифрование паролей в SharedPreferences, поскольку любой злоумышленник, имеющий доступ к вашему файлу настроек, с большой вероятностью также имеет доступ к двоичному файлу вашего приложения и, следовательно, к ключам для дешифрования. пароль.
Однако, как говорится, похоже, что существует инициатива по рекламе, направленная на выявление мобильных приложений, которые хранят свои пароли в виде открытого текста в SharedPreferences, и освещает эти приложения в неблагоприятном свете. См. Http://blogs.wsj.com/digits/2011/06/08/some-top-apps-put-data-at-risk/ и http://viaforensics.com/appwatchdog для некоторых примеров.
Хотя нам нужно больше внимания уделять безопасности в целом, я бы сказал, что такого рода внимание к этой конкретной проблеме на самом деле существенно не повышает нашу общую безопасность. Тем не менее, при таком восприятии, вот решение для шифрования данных, которые вы размещаете в SharedPreferences.
Просто оберните свой собственный объект SharedPreferences в этом, и любые данные, которые вы читаете / пишете, будут автоматически зашифрованы и расшифрованы. например.
Вот код для класса:
источник
Самый простой способ сохранить одно предпочтение в Android Activity - сделать что-то вроде этого:
Если вас беспокоит их безопасность, вы всегда можете зашифровать пароль перед его сохранением.
источник
Используя фрагмент, предоставленный Ричардом, вы можете зашифровать пароль перед его сохранением. API предпочтений, однако, не предоставляет простой способ перехватить значение и зашифровать его - вы можете заблокировать его сохранение через слушатель OnPreferenceChange, и вы теоретически можете изменить его через preferenceChangeListener, но это приведет к бесконечному циклу.
Ранее я предлагал добавить «скрытое» предпочтение для достижения этой цели. Это определенно не лучший способ. Я собираюсь представить два других варианта, которые я считаю более жизнеспособными.
Во-первых, самое простое в preferenceChangeListener, вы можете получить введенное значение, зашифровать его, а затем сохранить его в альтернативном файле настроек:
Второй способ, который я сейчас предпочитаю, - это создать свой собственный параметр, расширяя EditTextPreference, @ Override'ing методами
setText()
andgetText()
, чтобыsetText()
зашифровывать пароль иgetText()
возвращать ноль.источник
Ладно; Прошло много времени с тех пор, как ответ несколько смешанный, но вот несколько распространенных ответов. Я исследовал это как сумасшедший, и трудно было найти хороший ответ
Метод MODE_PRIVATE считается в целом безопасным, если вы предполагаете, что пользователь не рутировал устройство. Ваши данные хранятся в виде простого текста в той части файловой системы, которая доступна только исходной программе. Это облегчает получение пароля с помощью другого приложения на рутированном устройстве. Опять же, вы хотите поддерживать рутированные устройства?
AES - все еще лучшее шифрование, которое вы можете сделать. Не забудьте поискать это, если вы начинаете новую реализацию, если это было некоторое время, так как я отправил это. Самая большая проблема с этим - "Что делать с ключом шифрования?"
Итак, теперь мы находимся на «Что делать с ключом?» часть. Это сложная часть. Получение ключа оказывается не таким уж плохим. Вы можете использовать функцию получения ключа, чтобы взять какой-нибудь пароль и сделать его довольно безопасным ключом. Вы сталкиваетесь с такими вопросами, как «сколько проходов вы делаете с PKFDF2?», Но это уже другая тема
В идеале вы должны хранить ключ AES на устройстве. Вы должны найти хороший способ получить ключ с сервера безопасно, надежно и безопасно, хотя
У вас есть какая-то последовательность входа (даже оригинальная последовательность входа, которую вы делаете для удаленного доступа). Вы можете сделать два запуска вашего генератора ключей по одному и тому же паролю. Как это работает, вы дважды получаете ключ с новой солью и новым безопасным вектором инициализации. Вы сохраняете один из этих сгенерированных паролей на устройстве и используете второй пароль в качестве ключа AES.
Когда вы входите в систему, вы заново получаете ключ при локальном входе в систему и сравниваете его с сохраненным ключом. Как только это будет сделано, вы используете ключ получения # 2 для AES.
Вы можете сделать много вариаций этих. Например, вместо полной последовательности входа в систему вы можете сделать быстрый PIN-код (производный). Быстрый PIN-код может быть не таким безопасным, как полная последовательность входа в систему, но во много раз безопаснее, чем обычный текст
источник
Я знаю, что это немного некромантия, но вы должны использовать Android AccountManager . Это специально для этого сценария. Это немного громоздко, но одна из вещей, которые он делает, - делает недействительными локальные учетные данные в случае смены SIM-карты, поэтому, если кто-нибудь проведет по телефону и вставит в него новую SIM-карту, ваши учетные данные не будут скомпрометированы.
Это также дает пользователю быстрый и простой способ доступа (и, возможно, удаления) к сохраненным учетным данным для любой учетной записи, которую они имеют на устройстве, все из одного места.
SampleSyncAdapter - пример, который использует сохраненные учетные данные учетной записи.
источник
Я брошу свою шляпу на ринг, просто чтобы поговорить о защите паролей в целом на Android. В Android двоичный файл устройства следует считать скомпрометированным - это то же самое для любого конечного приложения, которое находится под непосредственным контролем пользователя. Концептуально, хакер может использовать необходимый доступ к двоичному файлу, чтобы декомпилировать его и выкорчевать зашифрованные пароли и т. Д.
Таким образом, есть два предложения, которые я хотел бы высказать, если безопасность является серьезной проблемой для вас:
1) Не храните действительный пароль. Сохраните предоставленный токен доступа и используйте токен доступа и подпись телефона для аутентификации сеанса на стороне сервера. Преимущество этого состоит в том, что вы можете сделать токен ограниченным по продолжительности, вы не ставите под угрозу исходный пароль, и у вас есть хорошая подпись, которую вы можете использовать для корреляции с трафиком позже (например, для проверки попыток вторжения и аннулирования токен делает его бесполезным).
2) Использовать двухфакторную аутентификацию. Это может быть более раздражающим и навязчивым, но для некоторых случаев соблюдения требований неизбежно.
источник
Вы также можете проверить эту маленькую библиотеку, содержащую упомянутую вами функциональность.
https://github.com/kovmarci86/android-secure-preferences
Это похоже на некоторые другие подходы здесь. Надеюсь помогает :)
источник
Это дополнительный ответ для тех, кто прибывает сюда, основываясь на заголовке вопроса (как я это сделал), и ему не нужно заниматься вопросами безопасности, связанными с сохранением паролей.
Как использовать общие настройки
Пользовательские настройки обычно сохраняются локально в Android
SharedPreferences
с использованием пары ключ-значение. Вы используетеString
ключ, чтобы сохранить или найти соответствующее значение.Написать в общие настройки
Используйте
apply()
вместо того,commit()
чтобы сохранить в фоновом режиме, а не сразу.Читать из общих настроек
Значение по умолчанию используется, если ключ не найден.
Ноты
Вместо использования локального ключа String в нескольких местах, как я делал выше, было бы лучше использовать константу в одном месте. Вы могли бы использовать что-то вроде этого в верхней части вашего действия настройки:
Я использовал
int
в моем примере, но вы также можете использоватьputString()
,putBoolean()
,getString()
,getBoolean()
и т.д.Смотрите документацию для более подробной информации.
Есть несколько способов получить SharedPreferences. Посмотрите этот ответ для того, что посмотреть.
источник
Этот ответ основан на предложенном подходе Марка. Создается пользовательская версия класса EditTextPreference, которая преобразует назад и вперед между обычным текстом, видимым в представлении, и зашифрованной версией пароля, хранящейся в хранилище настроек.
Как указывалось большинством, кто ответил в этой теме, это не очень безопасный метод, хотя степень защиты частично зависит от используемого кода шифрования / дешифрования. Но это довольно просто и удобно, и помешает большинству случайных слежки.
Вот код для пользовательского класса EditTextPreference:
Это показывает, как его можно использовать - это файл «items», который управляет отображением настроек. Обратите внимание, что он содержит три обычных представления EditTextPreference и одно из пользовательских представлений EditPasswordPreference.
Что касается фактического шифрования / дешифрования, то это оставлено в качестве упражнения для читателя. В настоящее время я использую некоторый код, основанный на этой статье http://zenu.wordpress.com/2011/09/21/aes-128bit-cross-platform-java-and-c-encryption-compatibility/ , хотя и с другими значениями для ключа и вектора инициализации.
источник
Прежде всего, я думаю, что данные пользователя не должны храниться на телефоне, и если они должны храниться где-то на телефоне, они должны быть зашифрованы в личных данных приложений. Безопасность учетных данных пользователей должна быть приоритетом приложения.
Чувствительные данные должны храниться надежно или не храниться вообще. В случае утери устройства или заражения вредоносным ПО данные, хранящиеся небезопасно, могут быть скомпрометированы.
источник
Я использую Android KeyStore для шифрования пароля с помощью RSA в режиме ECB, а затем сохраняю его в SharedPreferences.
Когда я хочу вернуть пароль, я прочитал зашифрованный из SharedPreferences и расшифровал его, используя KeyStore.
С помощью этого метода вы генерируете открытую / закрытую пару ключей, где частная надежно хранится и управляется Android.
Вот ссылка о том, как это сделать: Android KeyStore Tutorial
источник
Общие настройки - это самый простой способ хранения данных нашего приложения. но возможно, что любой может очистить наши общие данные о предпочтениях через менеджер приложений. поэтому я не думаю, что это абсолютно безопасно для нашего приложения.
источник
вам нужно использовать sqlite, apit безопасности для хранения паролей. Вот лучший пример, который хранит пароли, - Passwordsafe. вот ссылка на источник и объяснение - http://code.google.com/p/android-passwordsafe/
источник