Защита конфиденциальности ваших пользователей: безопасность приложений Android для разработчиков

Автор: Peter Berry
Дата создания: 20 Lang L: none (month-012) 2021
Дата обновления: 16 Июнь 2024
Anonim
Безопасность мобильных приложений
Видео: Безопасность мобильных приложений

Содержание


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

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

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

Использование небрежного подхода к безопасности мобильных устройств может привести к очень плохой огласке.


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

Держите свои зависимости в актуальном состоянии

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

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


Если ваше приложение использует Сервисы Google Play, то вы можете проверить, установлена ​​ли на устройстве пользователя самая последняя версия, а затем запустить обновление, если это необходимо.

Чтобы проверить, обновлены ли службы Google Play на устройстве, вызовите метод installIfNeeded () класса ProviderInstaller. Если доступно обновление, этот метод вызовет исключение авторизации, и пользователю будет предложено обновить сервисы Google Play на своем устройстве.

Ограничьте ваши запросы на разрешение

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

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

Кроме того, вы можете использовать намерения для передачи задачи в приложение, которое уже имеет необходимые разрешения. Например, вместо запроса разрешений READ_CONTACTS и WRITE_CONTACTS вы можете делегировать задачу приложению «Контакты»:

Intent contactIntent = новое намерение (Intent.ACTION_INSERT); contactIntent.setType (ContactsContract.Contacts.CONTENT_TYPE); if (contactIntent.resolveActivity (getPackageManager ())! = null) {startActivity (contactIntent); }

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

Пусть ваши пользователи решат: Отображение выбора приложения

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

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

При выдаче неявного намерения вы должны по возможности отображать средство выбора приложений Android.

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

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

Intent myIntent = new Intent (Intent.ACTION_SEND); Список возможнымActivitiesList = queryIntentActivities (намерение, PackageManager.MATCH_ALL); // Проверяем, могут ли несколько приложений обрабатывать это намерение // if (возможныйActivitiesList.size ()> 1) {// Отображение выбора приложения // Строка title = getResources (). GetString (R.string.app_chooser_title); Intent chooser = Intent.createChooser (намерение, заголовок); startActivity (Chooser); } else if (intent.resolveActivity (getPackageManager ())! = null) {startActivity (intent); }

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

Избегайте внешнего хранения

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

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

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

В следующем фрагменте мы записываем данные во внутреннее хранилище:

final String FILE_NAME = "user_data.txt"; String fileContents = "Этот текстовый файл содержит конфиденциальные данные пользователя"; try (BufferedWriter writer = new BufferedWriter (новый FileWriter (новый файл (getFilesDir (), FILE_NAME)))) {writer.write (fileContents); } catch (IOException e) {// To to: Обрабатывать исключение //}

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

Использовать новый доступ к каталогу в Android

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

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

Вместо того, чтобы запрашивать разрешение READ_EXTERNAL_STORAGE, вы можете запросить доступ к определенному каталогу. это доступ к каталогу требует, чтобы вы использовали класс StorageManager и затем создали намерение, вызвав метод StorageVolume.createAccessIntent () этого экземпляра. Например, в следующем фрагменте мы получаем доступ к внешнему каталогу Pictures:

StorageManager newStorageManager = (StorageManager) getSystemService (Context.STORAGE_SERVICE); StorageVolume volume = newStorageManager.getPrimaryStorageVolume (); Intent intent = volume.createAccessIntent (Environment.DIRECTORY_PICTURES); startActivityForResult (намерение, код запроса);

Если пользователь предоставит вашему приложению доступ к этому внешнему каталогу, то Android вызовет переопределение onActivityResult () с кодом результата RESULT_OK, а также с намерением, содержащим URI для запрошенного каталога.

Никогда не кэшируйте конфиденциальные пользовательские данные

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

Для кешей размером более 1 МБ вы можете использовать getExternalCacheDir (), который будет возвращать путь к каталогу приложения, где вы можете хранить кэшированный контент.

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

Защитите свои ключи от несанкционированного использования

Система Android Keystore позволяет хранить криптографические ключи в контейнере, что затрудняет извлечение этих ключей из устройства.

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

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

Сделайте ваши ContentProviders частными

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

Если вам явно не нужно обмениваться данными со сторонним приложением, вы должны сделать все свои ContentProviders закрытыми, пометив их как android: exported = false в манифесте вашего приложения. Если ваше приложение совместимо с Android 4.1.1 или более ранней версией, особенно важно пометить свои частные ContentProviders как android: exported = false, так как все ContentProviders по умолчанию общедоступны.

Отпечаток пальцев ваших пользователей с биометрической аутентификацией

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

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

следить все лучшие практики работы в сети

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

Всякий раз, когда вам нужно выполнить сетевую транзакцию, важно следовать всем рекомендациям Android по работе в сети:

  • Используйте HTTPS вместо HTTP, когда это поддерживается на сервере.
  • Никогда не доверяйте данным, загруженным из незащищенных протоколов, включая любые ответы, выданные на HTTP.
  • Используйте соответствующие протоколы для конфиденциальных данных, такие как HttpsURLConnection.
  • Там, где возможна аутентификация, используйте механизм Android IPC, такой как Сервис.
  • Используйте средство сетевой безопасности Nogotofail с открытым исходным кодом, чтобы протестировать ваше приложение на предмет известных уязвимостей TLS / SSL и неправильной конфигурации. Nogotofail включает в себя тесты для распространенных проблем с проверкой сертификатов SSL, ошибок библиотек HTTPS и TLS / SSL, проблем с открытым текстом и проблем с разбором SSL и STARTTLS. Для получения дополнительной информации посетите страницу GitHub Nogotofail.
  • По возможности избегайте загрузки кода извне вашего APK, поскольку это увеличивает шансы того, что кто-то в сети изменит ваш код во время передачи.

Используйте WebViews с осторожностью

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

Если вы неправильно используете WebViews, ваше приложение будет уязвимо для распространенных проблем веб-безопасности.

Чтобы обеспечить безопасность пользователей Android, компонент WebView по умолчанию не выполняет JavaScript. Однако при необходимости вы можете включить JavaScript, используя getSettings () для получения WebSettings, а затем запустив метод setJavaScriptEnabled ():

WebView myWebView = (WebView) findViewById (R.id.webview); WebSettings webSettings = myWebView.getSettings (); webSettings.setJavaScriptEnabled (истина);

Даже если вам нужно включить JavaScript, вам следует избегать использования addJavaScriptInterface () везде, где это возможно, так как этот метод внедряет предоставленный Java-объект в компонент WebView. Если ваше приложение установлено на устройстве под управлением Android 4.2 или более ранней версии, этот метод потенциально может позволить JavaScript манипулировать вашим приложением.

Если вы используете WebViews, вы не должны позволять пользователям переходить на любой веб-сайт, который вы не контролируете, но, в частности, вам следует никогда используйте метод addJavascriptInterface (), если пользователь потенциально может перейти на ненадежную веб-страницу, так как это представляет серьезную угрозу безопасности приложения Android.

Никогда не следует использовать метод addJavascriptInterface (), если пользователь потенциально может перейти на ненадежную веб-страницу.

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

Управление уровнем защищенных сокетов вашего приложения (SSL)

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

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

Чтобы упростить этот процесс, на серверах часто устанавливаются сертификаты от известных центров сертификации (ЦС). На уровне API 17 Android поддерживает более 100 CA, которые обновляются с каждым выпуском. При выдаче сертификата для сервера ЦС подпишет сертификат сервера, используя свой закрытый ключ, и клиент может затем проверить, что сертификат выдан ЦС, который известен и пользуется доверием на платформе Android.

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

URL url = новый URL ("https://www.google.com"); HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection (); urlConnection.connect (); InputStream in = urlConnection.getInputStream ();

Однако есть несколько сценариев, в которых приведенный выше код приведет к исключению:

  • CA, выдавший сертификат сервера, неизвестен. В этом сценарии вы можете научить HttpsURLConnection доверять этому набору CA.
  • Сертификат сервера был самозаверяющим, что означает, что сервер действует как собственный ЦС. Для самозаверяющих сертификатов вы можете создать свой собственный TrustManager, хотя вы должны убедиться, что ваш самоподписанный сертификат имеет надежный ключ.
  • В конфигурации сервера отсутствует промежуточный ЦС. Многие публичные центры сертификации не подписывают сертификаты сервера напрямую. Android доверяет только корневым ЦС, поэтому серверу потребуется отправить цепочку сертификатов от ЦС сервера через любые промежуточные звенья, необходимые для достижения корневого ЦС. Если вы не можете настроить сервер для включения промежуточного ЦС в цепочку серверов, то одним из возможных способов обхода проблемы является создание собственного TrustManager.

Создание файла конфигурации сетевой безопасности: доверие пользовательских ЦС

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

Чтобы создать файл конфигурации сетевой безопасности:

  • Если в вашем проекте еще нет папки XML, вам нужно ее создать. Удерживая нажатой клавишу «Control», щелкните папку Res вашего проекта и выберите «Создать»> «Каталог ресурсов Android»
  • Создайте новый файл ресурсов XML внутри своего каталога XML, который будет служить вашим файлом конфигурации сетевой безопасности. Я называю этот файл network_config.
  • Откройте файл конфигурации сети и укажите, что весь трафик к следующим доменам должен использовать HTTPS:

// Отключить чистый текст // // Применим это правило к домену и всем его поддоменам // my.domain.com ... ... ...

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

my.domain.com // Набор якорей доверия для безопасных соединений // // Набор сертификатов для элементов trust-anchors и источник этих сертификатов //

Не забудьте объявить файл конфигурации сетевой безопасности в своем манифесте:

Затем вам нужно будет добавить доверенные центры сертификации в res / raw / trust_cas вашего проекта в формате PEM или DER.

Доверяйте дополнительным CA, где это уместно

Наконец, вы можете доверять дополнительным центрам сертификации, которые не известны платформе Android. Чтобы увеличить количество ЦС, которым доверяет ваше приложение, вам нужно указать несколько источников сертификатов:

Никогда не отправляйте конфиденциальные данные с помощью SMS

Если вам нужно передать данные с сервера на ваше приложение, вам следует использовать Google Cloud Messaging (GCM) и IP-сообщения, а не незашифрованный протокол SMS.

Также прочитайте: Разработка Android: как совершать звонки, получать SMS и получать контакты пользователей

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

Защита от угроз безопасности с API-интерфейсами SafetyNet

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

Android поддерживает следующие API SafetyNet:

  • API Аттестации SafetyNet, Этот API-интерфейс защиты от злоупотреблений позволяет получить доступ к устройству Android, на котором выполняется приложение, и определить, взаимодействуют ли ваши серверы с подлинным устройством.
  • API SafeNet для безопасного просмотра, Вы можете использовать этот API, чтобы определить, классифицировал ли Google определенный URL как известную угрозу.
  • SafetyNet reCAPTCHA API, Этот сервис включает в себя API reCAPTCHA, который вы можете использовать для защиты своего приложения от таких угроз, как спам и вредоносный трафик. Если API подозревает, что ваше приложение взаимодействует с ботом, то оно подаст CAPTCHA, который должен решить получатель, прежде чем он сможет продолжить использовать ваше приложение.
  • API приложений SafetyNet Verify, Если ваше приложение содержит конфиденциальные пользовательские данные, вы можете использовать этот API-интерфейс для взаимодействия с функцией проверки приложений на устройстве и проверки на отсутствие в устройстве вредоносных приложений. Если устройство не защищено, вы можете ограничить ущерб, отключив все важные функции вашего приложения. Просто имейте в виду, что, хотя SafetyNet будет предупреждать пользователей обо всех потенциально опасных приложениях, которые он обнаружит, нет никакой гарантии, что пользователь действительно удалит эти приложения. Кроме того, вредоносные приложения выпускаются постоянно, а хакеры всегда находят новые и оригинальные способы ускользнуть от радаров, поэтому даже если устройство проходит тест SafetyNet, вы не должны предполагать, что на нем нет вредоносных приложений. Устройство.

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

Используйте защищенное подтверждение Android для конфиденциальных транзакций

Если вашему приложению требуется выполнить конфиденциальную транзакцию, такую ​​как платеж, вы можете использовать Защищенное подтверждение Android на устройствах под управлением Android 9 (уровень API 28) или выше.

Каждый раз, когда пользователь пытается выполнить конфиденциальную транзакцию, Android Protected Confirmation будет отображать подсказку с просьбой принять короткое заявление. Если пользователь одобряет это заявление, вы можете подписать ключ с помощью Android Keystore.

Для получения дополнительной информации, а также инструкций о том, как реализовать защищенное подтверждение Android, ознакомьтесь с официальными документами по Android.

Android 10: прямой запуск встроенного кода DEX

На устройствах под управлением Android 10 (уровень API 29) и выше можно встраивать встроенный код DEX непосредственно из файла APK вашего приложения, что может помочь предотвратить атаку, даже если хакеру удастся вмешаться в локально скомпилированный код устройства.

Читайте также: Изучение Android Q: Добавление пузырьковых уведомлений в ваше приложение

Чтобы включить эту новую функцию безопасности, откройте манифест вашего проекта и добавьте следующее к элементу:

Затем вам нужно создать APK-файл, содержащий несжатый код DEX, к которому ART может получить прямой доступ. Откройте файл build.gradle и добавьте следующее:

aaptOptions {noCompress dex}

Просто помните, что ART будет использовать JIT-компилятор при запуске вашего приложения, что может повлиять на производительность вашего приложения.

Завершение

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

Есть ли у вас какие-либо советы по повышению безопасности вашего приложения? Обязательно поделитесь своими советами в комментариях ниже!

Если вы не успеваете за выпусками ony, вы не одиноки. Японский производитель известен быстрой скоростью запуска новых версий смартфонов, и мы привыкли ожидать (слегка) обновленную модель Xperia на каж...

8 февраля 2019 г. 8 февраля 2019 г. Хотя приложение ony Xperia XZ3 немного загромождено, оно хорошо организовано. Внизу находится кнопка спуска затвора (когда телефон находится в портретной ориента...

Статьи портала