Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. iOS SDK
Code

Безопасность данных iOS в покое: защита данных  

by
Length:LongLanguages:
This post is part of a series called Securing iOS Data at Rest.
Securing iOS Data at Rest: The Keychain

Russian (Pусский) translation by Yuri Yuriev (you can also view the original English article)

Это первая из трёх статей по защите пользовательских данных в состоянии покоя. Начнём с основ безопасности в iOS, чтобы ознакомиться с современными рекомендациями по их хранению со Swift.

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

Права доступа

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

Для многих версий iOS требовалось, чтобы приложения запрашивали разрешения на использование и хранение личных данных, которые являются внешними по отношению к приложению, например при сохранении и загрузке изображений в библиотеку. Начиная с iOS 10, любые API, которые обращаются к личным данным, требуют, чтобы вы объявили об этом заранее в файле info.plist .

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

  • Bluetooth Sharing: NSBluetoothPeripheralUsageDescription
  • Calendar: NSCalendarsUsageDescription
  • CallKit: NSVoIPUsageDescription
  • Camera: NSCameraUsageDescription
  • Contacts: NSContactsUsageDescription
  • Health: NSHealthShareUsageDescription,  NSHealthUpdateUsageDescription
  • HomeKit: NSHomeKitUsageDescription
  • Location: NSLocationAlwaysUsageDescription, NSLocationUsageDescription, NSLocationWhenInUseUsageDescription
  • Media Library: NSAppleMusicUsageDescription
  • Microphone: NSMicrophoneUsageDescription
  • Motion: NSMotionUsageDescription
  • Photos: NSPhotoLibraryUsageDescription
  • Reminders: NSRemindersUsageDescription
  • SpeechRecognition:  NSSpeechRecognitionUsageDescription
  • SiriKit: NSSiriUsageDescription
  • TV Provider: NSVideoSubscriberAccountUsageDescription

Например, вот запись в info.plist, которая позволяет приложению загружать и хранить значения в календаре.

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

API защиты данных

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

Но если вам необходимо хранить данные, рекомендуется включить Apple's Data Protection.

Data Protection шифрует содержимое вашего приложения. Он полагается на код доступа, значит, безопасность шифрования связана с надёжностью пароля. С улучшением Touch ID и шифрования файловой системы, введенным в iOS 10.3, система защиты данных стала намного надёжней. Вы можете включить защиту данных в своем приложении, включив Data Protection в Capabilities файла проекта. Обновится профиль обеспечения и файл разрешений, чтобы запустить Data Protection. Защита данных предлагает четыре уровня защиты, описываемых структурой FileProtectionType:

  • none: нет защиты.
  • complete: данные недоступны, пока девайс заблокирован. Рекомендованная настройка для всех приложений.
  • completeUnlessOpen: данные доступны, когда устройство разблокировано и останутся доступны, пока файл не будет закрыт, даже если пользователь заблокирует устройство. Файлы могут быть созданы, когда устройство заблокировано. Этот вариант хорош, когда вам нужно открыть файл для обработки и продолжить процесс, даже если приложение работает в фоновом режиме заблокированного устройства. В качестве примера может быть задание по загрузке файла на сервер.
  • completeUntilFirstUserAuthentication:  файлы недоступны, пока пользователь не разблокирует устройство. После этого файлы становятся доступными, даже когда устройство заблокировано заново. Этот вариант хорош для файлов, которые понадобятся позднее, в фоновом режиме, когда устройство заблокировано, например, во время извлечения фона.

complete по умолчанию. Чтобы избежать сбоев, когда ваш код пытается получить доступ к заблокированным данным, вы можете зарегистрироваться для получения уведомлений через UIApplicationProtectedDataDidBecomeAvailableиUIApplicationProtectedDataWillBecomeUnavailable для поиска, когда данные станут доступны.

Кроме того, можете проверить флажок UIApplication.shared.isProtectedDataAvailable .

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

Можно установить уровень защиты при записи в файл. Объект Data имеет метод, который может записывать свои данные в файл, и вы можете установить уровень защиты при вызове этого метода.

Вы также можете установить уровень защиты при настройке модели Core Data.

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

Неприкосновенность данных

Часть защиты сохранённых данных включает проверку их целостности. Не стоит слепо доверять данным, которые вы загружаете из хранилища; они могли быть случайно или злонамеренно изменены. Протокол NSSecureCoding можно использовать для безопасной загрузки и сохранения данных из хранилища. Он удостоверится, что загружаемые объекты содержат ожидаемые данные. Если вы будете сохранять свой объект, он должен соответствовать протоколу безопасного кодирования внутри вашего класса.

Класс должен быть унаследован от NSObject. Затем, чтобы включить безопасное кодирование, переопределите метод протокола supportsSecureCoding.

Если ваш объект упорядочивается с помощью init? (Coder aDecoder: NSCoder), метод decodeObject (forKey :) должен быть заменен на decodeObject (of: forKey :), это гарантирует, что нужные типы объектов будут распакованы из хранилища.

Если вы используете NSKeyedUnarchiver для загрузки данных из хранилища, обязательно установите его свойство RequireSecureCoding.

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

Помимо NSSecureCoding, полезно выполнять собственные проверки данных при распаковке любого архива или любого произвольного ввода в целом.

Следы данных

По мере развития iOS появляются новые функции, которые могут способствовать утечке хранимых данных. Начиная с iOS 9, вы можете проиндексировать ваш контент в поиске Spotlight, а в iOS 10 можно пользоваться виджетами, вроде Today Widget, который виден на заблокированном экране. Будьте осторожны, выставляя свой контент с этими новыми функциями. Вы можете показать больше, чем хотелось!

В iOS 10 появилась новая функция Handoff, в которой ваши скопированные данные автоматически распределяются между устройствами. Опять же, будьте осторожны с конфиденциальными данными для передачи. Вы можете пометить личный контент как localOnly. Или установить дату и время истечения срока действия данных.

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

Анимация, которая появляется при переходе приложения в фоновый режим, достигается снимком screenshot с вашего приложения, который затем используется для анимации. Когда вы смотрите на список открытых приложений, этот снимок там присутствует. Он сохраняется на устройстве.

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

Удалите уведомления, когда представление исчезнет.

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

Вы должны настроить поле пароля для безопасного ввода текста. Защищённые текстовые поля не отображают пароль или не используют кэш клавиатуры.

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

Сетевые подключения также могут кэшироваться для хранения. Дополнительную информацию об удалении и отключении сетевого кэша можно найти в статье Securing Communications on iOS.

Уничтожение данных

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

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

Реализация, приведенная ниже, может находиться внутри .c file. Чтобы использовать эту функцию в Swift, вам нужно добавить определение функции или файл, который содержит функцию, в свой header. Затем вы можете вызвать эту функцию прямо перед тем местом, где вы используете методы FileManager removeFile. Возможно, вы захотите использовать лучшие методы, описанные в этом и последующих уроках по обновлению приложения. Вы можете затем стереть предыдущие незащищённые данные.

Заключение

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

Пока что ознакомьтесь с некоторыми другими нашими статьями о разработке приложений для iOS!


Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.