2011-03-01 2 views
24

Только что увидела сессию 209 - Защита данных приложения от WWDC 2010 года.Реализация и тестирование защиты данных iOS

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

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

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

Спасибо!

+1

Мне было интересно то же самое - когда устройство заблокировано, я не могу добраться до файловой системы, чтобы узнать, зашифрованы ли файлы (а не действительно заинтересованы в джейлбрейке). –

ответ

8

С NSFileManager класса документ:

The file is stored in an encrypted format on disk and cannot be read from or written to while the device is locked or booting.

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

When writing the contents of an NSData object to disk using the writeToFile:options:error: method, include the NSDataWritingFileProtectionComplete option.

Use the setAttributes:ofItemAtPath:error: method of NSFileManager to add the NSFileProtectionKey attribute (with the NSFileProtectionComplete value) to an existing file

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 :. Любые попытки доступа к защищенным файлам, когда они недоступны, не удастся.

+5

ok .. но как я могу проверить защиту? Я имею в виду, я хочу сделать что-то, что говорит мне, что файл защищен. – Omer

+0

@Omer. Вы могли выяснить способ проверить его? Я пробовал уже 2 дня, я разместил здесь свой вопрос с кодом: http://stackoverflow.com/questions/39151959/nsfileprotectioncomplete-doesnt-encrypt-the-core-data-file# – EmbCoder

+0

Честно говоря, этот вопрос является доброй старой, и я не очень много помню. Но то, что я делаю, это использовать какое-то программное обеспечение, такое как iExplorer, и пытаться получить доступ к файлам с телефона. Когда они защищены, файлы перечислены, но с 0 байтами в качестве размера, и вы не сможете их открыть. Вы пробовали что-то вроде этого? – Omer

23

Обновление: С 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 независимо от того, включена ли защита данных или нет.

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

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

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

[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, чтобы иметь возможность отмечать приложение как требующее Data Защита должна быть включена. (rdar: // 10167256)

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

+0

Я пробовал реализовать метод doReload (с задержкой), но он не вызывается до тех пор, пока устройство не разблокируется и данные не будут доступны. Как я могу убедиться, что он вызван в фоновом режиме? –

+0

Дополнительная информация о том, как проверить, что защита файлов включена, при использовании файла прав, на котором есть защита данных? – lostintranslation

10

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

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

+2

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

+0

@FerasArabiat: как я могу убедиться, что устройство не включено как устройство разработчика в Xcode 7? Когда я нажимаю правой кнопкой мыши в окне «Устройства», я не вижу возможности игнорировать. Кроме того, не следует ли вообще показывать какие-либо данные, если устройство не настроено в Xcode в качестве устройства разработки, независимо от того, зашифровано или нет? – EmbCoder

+0

@ EmbCoder, я думаю, что он был удален в XCode 6 ... Я не на 100% уверен в этом, поскольку я сам не пробовал, но в документации на яблоки говорится следующее: 1. Подключите устройство к вашему Mac. 2. В окне Xcode выберите «Окно»> «Устройства» и выберите устройство под «Устройства». 3. В левом нижнем углу окна «Устройства» нажмите кнопку «Действие» (значок шестеренки справа от кнопки «Добавить»). 4. Во всплывающем меню выберите «Показать в меню« Пуск пунктов назначения ». –

4

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

- (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; 
} 
+0

Я попытался сделать это таким образом, но '[attributes valueForKey: NSFileProtectionKey]' дает мне всегда нуль, я думаю, этот атрибут не может быть получен с помощью 'fileManager'. –

+0

OK, 'NSFileProtectionKey' можно получить только на устройстве. Это не работает для симулятора. –

+0

@MichalCichon, что не должно быть, пожалуйста, подайте радар – quellish

5

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

  1. Удалить и переустановить приложение
  2. На устройстве IOS перейдите в раздел Настройки> кода доступа и обеспечить «Требовать Passcode» установлен к «Сразу»
  3. Блокировка телефона и подождите 20 секунд
  4. на Xcode перейти в окно> Устройства
  5. Выберите приложение, которое вы хотите протестировать
  6. Щелкните по настройкам cog и выберите 'download container'
  7. Щелкните правой кнопкой мыши загруженный файл .xcappdata и выберите «Показать содержимое пакета». Все, что вы можете посмотреть здесь, не было зашифровано NSFileProtectionComplete
  8. Разблокируйте телефон и повторите шаги 3-6. Файлы, которые ранее не отображались, которые вы теперь можете просмотреть, были успешно зашифрованы.

enter image description here

+0

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

+0

@ EmbCoder Они не будут отображаться в списке. Предположительно, поскольку ваша операционная система не сможет их прочитать. – Deco

+0

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

3

Я не думаю, что вы можете проверить Защита данных с помощью компьютерных средств и не взломанных iPhone больше - может быть, вы могли бы в прошлом. Пожалуйста, см. Мой ответ здесь для обновления метода тестирования. Защита данных: https://stackoverflow.com/a/40044841/1165843

+0

Вы правы, сегодня было немного паникой, проверяя, что NSDataProtectionComplete зашифровывает plists, которые я понял, я мог видеть все в контейнере приложений при подключении к XCode> Devices. Это не было раньше. – Deco

Смежные вопросы