Как безопасно хранить пароли в Android, используя общие настройки или базу данных sqlite?

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

В основном вещь управления паролями.

Вещи, которые нужно хранить:

Что нужно хранить

Когда я нажимаю кнопку «Сохранить», я хотел, чтобы она была сохранена где-то локально. Чтобы я мог получить их и отобразить в другом действии.

Могу ли я безопасно поделиться этими вещами в SharedPreferences для всех этих записей паролей? [Под вводом пароля я имел в виду весь класс]

Я упомянул что-то вроде ComplexPreferences [ http://blog.nkdroidsolutions.com/class-object-in-sharedpreferences/ ]

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

Если это невозможно сделать с помощью SharedPreferences, как я могу сделать это с базой данных SQLite?

Но как я могу безопасно их сохранить? Я мало что знаю о безопасности в Android.

Пожалуйста, направляйте.


person Levi    schedule 06.12.2016    source источник
comment
Какую ошибку вы получаете?   -  person Nigam Patro    schedule 06.12.2016
comment
E/RecyclerView: адаптер не подключен; пропуская макет Но дело в том, что я не знаю, как правильно реализовать. Итак, я не знаю, действительно ли данные сохраняются или нет. Могу ли я хранить такие пароли?   -  person Levi    schedule 06.12.2016
comment
Это не ошибка, где вы столкнулись с проблемой и что вы пробовали?   -  person Nigam Patro    schedule 06.12.2016
comment
Можно ли хранить такие пароли? Могу ли я использовать для этого ComplexPreferences? Если да, то я мог бы работать с этим.   -  person Levi    schedule 06.12.2016
comment
В основном, что вы подразумеваете под ComplexPreferences?   -  person Nigam Patro    schedule 06.12.2016
comment
blog.nkdroidsolutions.com/class-object-in-sharedpreferences   -  person Levi    schedule 06.12.2016
comment
Посмотрите, нет ничего лучше сложных предпочтений developer.android.com /обучение/основы/хранилище данных/   -  person Nigam Patro    schedule 06.12.2016
comment
Это модифицированный класс для хранения объектов класса в общих настройках. Пожалуйста, перейдите по ссылке, которую я упомянул выше.   -  person Levi    schedule 06.12.2016
comment
Да, точно, вы можете хранить эти данные. Это не проблема. Потому что данные, которые вы храните в SharedPreference и SQLite db, не могут быть доступны другим приложениям.   -  person Nigam Patro    schedule 06.12.2016
comment
Его можно взломать? Не могли бы вы помочь мне с кодом, как хранить и извлекать данные объекта этого класса с использованием общих настроек в повторно используемом представлении?   -  person Levi    schedule 06.12.2016
comment
Если устройство не рутировано, никто не сможет взломать эти данные. Итак, в соответствии с указанным вами требованием хранить данные и извлекать данные для отображения в списке, лучше выбрать SQLite database.   -  person Nigam Patro    schedule 06.12.2016
comment
Если я публикую свое приложение с помощью базы данных SQLite, все ли недооценивают мое приложение из-за того, что оно небезопасно?   -  person Levi    schedule 06.12.2016
comment
Это не так. Ни один пользователь не увидит, что вы используете sqlite или что-то другое. И ха, если вы хотите защитить данные, вы можете применить некоторый алгоритм шифрования для хранения пароля.   -  person Nigam Patro    schedule 06.12.2016
comment
Пожалуйста, укажите это как ответ. Как добавить шифрование пароля при вводе данных и как расшифровать его при извлечении данных?   -  person Levi    schedule 06.12.2016
comment
Вы можете использовать эту библиотеку, пожалуйста, обратитесь к их документации для лучшего понимания github.com/scottyab/AESCrypt-Android   -  person Nigam Patro    schedule 06.12.2016
comment
Большое спасибо. Я думаю, что буду использовать его с SQLite. Это довольно безопасно, верно?   -  person Levi    schedule 06.12.2016
comment
Да. Добро пожаловать.   -  person Nigam Patro    schedule 06.12.2016


Ответы (3)


Общие настройки и sqlite db безопасны только для расширения. Он может быть легко доступен и может быть изменен, даже если есть несколько приложений, доступных для редактирования общих настроек и sqlite db в playstore. **

Поэтому я предпочитаю не хранить его локально

.Вы можете использовать некоторые **алгоритмы и механизмы для шифрования и расшифровки данных, которые вы собираетесь хранить локально. если устройство рутировано, это СЕРЬЕЗНАЯ ПРОБЛЕМА

person ashik    schedule 06.12.2016
comment
Можете ли вы указать какое-либо приложение, которое доступно для получения данных некоторых других приложений? - person Nigam Patro; 06.12.2016
comment
Я не знаю другого метода. Это простое приложение. Если я храню его локально, как сделать его безопасным? Пожалуйста помоги. Я думаю, что хранение на сервере не является бесплатным. Поэтому я использую локальный метод. - person Levi; 06.12.2016
comment
Можете ли вы объяснить кое-что подробно? - person Levi; 06.12.2016
comment
это может тебе помочь - person ashik; 06.12.2016

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

  1. Спрашивайте у пользователя пароль каждый раз, когда он открывает приложение. Сгенерируйте фактический ключ шифрования, используя password-based encryption и то же значение соли.

  2. Вы можете использовать Android Keystore Provider для создания ключа шифрования и сохранения его в безопасном месте на устройстве. Позже вы извлекаете запись из хранилища ключей и используете ее для шифрования/дешифрования записей базы данных с помощью javax.crypto.Cipher.

Оба варианта гарантируют отсутствие ключа шифрования в приложении.

person dev.bmax    schedule 06.12.2016
comment
Не могли бы вы объяснить эту вещь немного проще? Как вы сказали, после создания всех паролей я должен зашифровать их и сохранить в базе данных. После получения я должен расшифровать и показать. Это ? - person Levi; 10.12.2016

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

В этом примере вы можете легко работать с SharedPreference в приватном режиме< /а>. Более того, этого достаточно для большинства задач. Мы используем эту опцию, чтобы сохранить токен пользователя, и это нормально для системы. (Если говорить о безопасности этого способа, то у вас будет некоторый риск для кастомного ПЗУ, для Пользователей, которые вручную прошиты на устройстве.)

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

ОБНОВЛЕНИЕ!

Итак, вопрос был сильно обновлен с первой версии. Я буду обновлять информацию, что вы ищете. Локальное сохранение больших объемов зашифрованной информации.

Может быть, более простой способ сделать это, это просто использовать локальное шифрование данных, как я описал выше, используя Android KeyStore, KeyChain (ссылки выше). Вы создадите свою собственную KeyPair и будете использовать для шифрования и расшифровки некоторые данные. Но эти данные вы сохраните в своей БД в зашифрованном виде.

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

person GensaGames    schedule 06.12.2016
comment
Потому что я не знаю, как сохранить его в облаке. И я не знаю, дорого ли это. Вот почему я выбираю местный вариант. Можете вы помочь мне ? - person Levi; 23.12.2016
comment
@Levi Я обновлю ответ, но в любом случае это может быть сложно. - person GensaGames; 02.02.2017