Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Есть разные точки для рассмотрения:

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

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

Зашифрованные общие предпочтения на нерасширенном устройстве

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

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

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

Зашифрованные общие предпочтения на корневом устройстве

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

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

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

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

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

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

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

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

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

TL;DR

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

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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