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

Внедрение и тестирование защиты данных iOS

Просто увидел сессию 209 - Защита данных приложения от WWDC 2010 года.

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

Я только что реализовал его, но не могу понять, как проверить, включена ли защита, какие-либо идеи?

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

Спасибо!

4b9b3361

Ответ 1

Обновление:. В iOS 6 предположительно можно потребовать защиту данных для вашего приложения, используя право, которое должно быть настроено на ИД приложения в профиле инициализации iOS. Я еще не тестировал это, и это лучшая информация, которую я мог бы найти на нем https://devforums.apple.com/message/707939#707939


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

Защита файлов включена, установив атрибут NSFileProtectionKey файла NSFileProtectionComplete

Например, чтобы создать защищенный файл, вы можете запустить код, например:

[[NSFileManager defaultManager] createFileAtPath:[self filePath]
                                        contents:[@"super secret file contents" dataUsingEncoding:NSUTF8StringEncoding]
                                      attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
                                                                             forKey:NSFileProtectionKey]];

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

Хуже, атрибут NSFileProtectionComplete будет установлен независимо от того, защищен ли файл или нет. Следующее:

self.fileProtectionValue = [[[NSFileManager defaultManager] attributesOfItemAtPath:[self filePath]
                                                                             error:NULL] valueForKey:NSFileProtectionKey];

NSLog(@"file protection value: %@", self.fileProtectionValue);

выплюнет file protection value: NSFileProtectionComplete независимо от того, включена ли защита данных.

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

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

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

[self performSelector:@selector(doReload) withObject:nil afterDelay:20];

- (void)doReload {

    NSLog(@"protected data available: %@",[[UIApplication sharedApplication] isProtectedDataAvailable] ? @"yes" : @"no");

    NSError *error;

    self.fileContents = [NSString stringWithContentsOfFile:[self filePath]
                                              encoding:NSUTF8StringEncoding
                                                 error:&error];

    NSLog(@"file contents: %@\nerror: %@", self.fileContents, error);
}

Если вы запустите указанный выше код и заблокируете устройство, защищенное данными, оно выплюнет:

protected data available: no
file contents: (null)
error: Error Domain=NSCocoaErrorDomain Code=257 "The operation couldn’t be completed. (Cocoa error 257.)" UserInfo=0x16e110 {NSFilePath=/var/mobile/Applications/D71F1F1F-6C25-4848-BB1F-51539B47EC79/Documents/protected_file, NSUnderlyingError=0x16e010 "The operation couldn’t be completed. Operation not permitted"}

Требуется 20-секундная задержка, так как есть 10-секундный льготный период, когда защищенные данные все еще доступны после блокировки устройства с защитой данных.

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

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

Поскольку я не нашел способа проверить в приложении, что защита данных включена до того, как я напишу конфиденциальную информацию на диск, я подал запрос об улучшении функции с Apple, чтобы иметь возможность отмечать приложение как требующее защиты данных для включения. (Rdar://10167256)

Apple действительно предлагает решение этого с помощью своих API-интерфейсов управления мобильными устройствами (MDM), которые в сочетании с сторонним сервером могут использоваться для обеспечения соблюдения политик, требующих защиты данных на устройствах.

Ответ 2

Вы можете использовать приложение iExplorer, чтобы определить, зашифрованы ли ваши файлы. iExplorer позволяет просматривать файловую систему вашего iPhone/iPad и открывать файл (конечно, ваше устройство должно быть подключено к вашему Mac).

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

Ответ 3

Из NSFileManager класс doc:

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

Вы просто передаете константу при настройке атрибутов файла.

При написании содержимого объекта NSData на диск с помощью метода writeToFile: options: error: включить параметр NSDataWritingFileProtectionComplete.

Используйте метод setAttributes: ofItemAtPath: error: метод NSFileManager для добавления атрибута NSFileProtectionKey (со значением NSFileProtectionComplete) в существующий файл

http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StandardBehaviors/StandardBehaviors.html

EDIT (определение доступности защищенных файлов)

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

*

  The application delegate can implement the applicationProtectedDataWillBecomeUnavailable: and applicationProtectedDataDidBecomeAvailable: methods and use them to track changes to the availability of protected data.
*

  An application can register for the UIApplicationProtectedDataWillBecomeUnavailable and UIApplicationProtectedDataDidBecomeAvailable notifications.
*

  The protectedDataAvailable property of the shared UIApplication object indicates whether protected files are currently accessible. 

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

Ответ 4

Тестирование можно выполнить в Xcode:

  • Удалить и переустановить приложение
  • На устройстве iOS перейдите в Настройки > Код доступа и убедитесь, что для параметра "Требовать пароль" установлено значение "Непосредственно"
  • Заблокируйте телефон и подождите 20 секунд.
  • В Xcode перейдите в Окно > Устройства
  • Выберите приложение, которое вы хотите протестировать.
  • Выберите настройки cog и выберите 'download container'
  • Щелкните правой кнопкой мыши загруженный файл .xcappdata и выберите "показать содержимое пакета". Все, что вы можете посмотреть здесь, не было зашифровано NSFileProtectionComplete
  • Разблокируйте телефон и повторите шаги 3-6. Файлы, которые ранее не отображались, которые вы теперь можете просмотреть, были успешно зашифрованы.

введите описание изображения здесь

Ответ 5

Защита файлов может быть включена для каждого файла или для каждого каталога или может быть включена для всего приложения (с использованием прав и профиля подготовки). Чтобы определить, защищен ли файл или каталог, проверьте атрибуты файловой системы для ключа защиты данных. Это должно быть допустимо даже для родительского каталога, который должен быть защищен:

- (BOOL) isProtectedItemAtURL:(NSURL *)URL {
    BOOL            result                      = YES;
    NSDictionary    *attributes                 = nil;
    NSString        *protectionAttributeValue   = nil;
    NSFileManager   *fileManager                = nil;

    fileManager = [[NSFileManager alloc] init];
    attributes = [fileManager attributesOfItemAtPath:[URL path] error:&error];
    if (attributes != nil){
        protectionAttributeValue = [attributes valueForKey:NSFileProtectionKey];
        if ((protectionAttributeValue == nil) || [protectionAttributeValue isEqualToString:NSFileProtectionNone]){
            result = NO;
        }
    } else {
        // handle the error
    }
    return result;
}

Чтобы определить, доступен ли защищенный контент, UIApplication предоставляет метод запроса состояния защиты isProtectedDataAvailable. Использование его с помощью вышеуказанного метода позволит вам определить, какой конкретный файл или каталог доступен:

- (BOOL) isItemAtURLAvailable:(NSURL *)URL {
    BOOL            result                      = NO;

    if ([self isProtectedItemAtURL:URL]){
        // Item is protected
        if ([[UIApplication sharedApplication] isProtectedDataAvailable]){
            // Protected content is available
            result = YES;
        }
    } else {
        result = YES;
    }

    return result;
}

Ответ 6

Я не думаю, что вы можете протестировать защиту данных с помощью компьютерных инструментов и не-jailbroken iPhone больше - возможно, вы могли бы в прошлом. См. Мой ответ здесь для обновленного метода тестирования защиты данных: fooobar.com/questions/214824/...