Безопасность с помощью SharedPreferences

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

Существуют различные точки зрения:

Общие предпочтения на некорневом устройстве

Данные здесь безопасны на уровне кода. Доступ к нему можно получить только через приложение (в злобной или обычной форме)

Шифрованное разделяемое предпочтение на неуправляемом устройстве

То же, что и выше. Ваши данные безопасны. Никакой разницы в уровне безопасности, он не менее безопасен или небезопасен, так как он будет не зашифрован.

Общие предпочтения на корневом устройстве

Доступ к данным возможен с помощью любого приложения. Но вы должны учитывать, что только очень небольшой процент (я думаю, что менее 1-2%, но нет надежных данных на interweb) устройств коренится, и если пользователь корни его устройство, он / она сознательно оставляет себя уязвимым. Это не системная система Android, если вы root, вы несете ответственность за последствия.

Шифрованное общее предпочтение на корневом устройстве

Таким образом, у вас есть возможность зашифровать ваши данные. Там есть готовые решения для этого . Но проблема заключается в том, чтобы держать ключ в тайне. Аркодированный ключ в исходном коде может быть легко декомпилирован (даже с байтовым кодом obfuscator, таким как Proguard). Ключ, созданный для каждого приложения, должен быть где-то сохранен, и в конце на корневом устройстве его можно получить независимо от местоположения (общий pref, sql, file). Серверная сторона для каждого ключа пользователя, которая сохраняется только в ОЗУ, немного более безопасна, но снижает удобство использования, поскольку вам нужно сделать запрос на сервер при первом запуске приложения или каждый раз, когда он собирает мусор. Это может помешать автономной работе.

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

Последствия разработки вредоносного приложения

С апреля 2011 года Google имеет встроенный сканер вредоносных программ в устройствах воспроизведения на устройстве (также на стороне сервера воспроизведения), который обнаруживает приложения для злоумышленников, и его определение часто обновляется (по крайней мере каждые 6 недель, как и цикл выпуска игры Магазин приложений) и работает с каждым Google Android 2.3.

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

Думаю, именно по этой причине есть еще несколько приложений для злоумышленников для Android и отсутствие широко распространенной «инфекции», по крайней мере, я знаю (средний уровень 2015 года).

Следует ли хранить конфиденциальные данные в App Store?

Я бы передумал, если ваш дизайн соответствует вашим требованиям. Обычно вы хотите хранить наименее конфиденциальные данные, которые вы можете получить, и получать их только с сервера, если вам это нужно, а затем хранить их только в ОЗУ, если вам это нужно. Поэтому данные, потенциально очень опасные, не должны постоянно сохраняться на устройстве (если это возможно). Поскольку мы обсуждали данные на вашем телефоне Android, нельзя защитить таким образом, чтобы удовлетворить все требования безопасности.

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

ТЛ; др

  • Сохраняйте конфиденциальные данные на телефоне, которые вам по существу необходимы для обеспечения разумного удобства использования вашего приложения. Все остальное принадлежит ОЗУ (как, например, элемент объекта), и должно быть получено по требованию и как можно короче
  • Существование эффективного вредоносного ПО для вашего приложения маловероятно
  • Shared Prefrence безопасен на всех устройствах, которые не сознательно становятся уязвимыми. Вы не имеете никакого влияния на это, поэтому вы не можете нести ответственность, поскольку это не стандартная функция телефона
  • Шифрование ваших данных на телефоне Android практически не дает никаких реальных улучшений безопасности

Обновление. Не совсем верно то, что я сказал о зашифрованных данных. См. Криптовальный код для решения проблемы шифрования данных на уязвимых устройствах.

SharedPreferences , в конечном счете, хранятся в файле XML в папке приложения в / data / data / … – этот путь должен быть закрытым и недоступен на устройстве без SharedPreferences ПО, либо другим приложением, либо пользователем непосредственно. Тем не менее, возможно укоротить устройство, а затем просто получить доступ к этой папке с помощью UID 0 или даже изменить разрешения.

Итак, на ваш вопрос:

Итак, есть ли способ защитить мои SharedPreferences от доступа из любого места

С точки зрения приложения невозможно изменить, как частные файлы приложения хранятся или каким-либо образом защищать их, поскольку это параметр файловой системы и обрабатывается ОС.

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

Единственное решение – зашифровать данные перед их хранением, использовать ли SharedPreferences или даже использовать локальную базу данных SQLite. Вы также можете использовать эту библиотеку, которая обеспечивает прозрачное 256-битное шифрование AES файлов базы данных SQLite. Также имейте в виду, что ваш APK можно декомпилировать, поэтому помните о ключах шифрования в вашем коде.

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

Приветствия.

Вы можете использовать SharedPreference, если вы шифруете свои данные.

Вот пример для шифрования / дешифрования данных:

 protected String encrypt( String value ) { try { final byte[] bytes = value!=null ? value.getBytes(UTF8) : new byte[0]; SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(),Settings.System.ANDROID_ID).getBytes(UTF8), 20)); return new String(Base64.encode(pbeCipher.doFinal(bytes), Base64.NO_WRAP),UTF8); } catch( Exception e ) { throw new RuntimeException(e); } } protected String decrypt(String value){ try { final byte[] bytes = value!=null ? Base64.decode(value,Base64.DEFAULT) : new byte[0]; SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(),Settings.System.ANDROID_ID).getBytes(UTF8), 20)); return new String(pbeCipher.doFinal(bytes),UTF8); } catch( Exception e) { throw new RuntimeException(e); } } 

Источник: что является наиболее подходящим способом хранения пользовательских настроек в приложении Android