2013-08-20 2 views
4

Я использую FMDB для работы с sqlite, и я предпочел бы избежать зависимости от SQLCipher. Как я могу просто использовать возможности DataProtection, встроенные в iOS? Возможно ли это - единственное требование - защитить данные в случае похищения телефона.FMDB и шифрование

Если телефон разблокирован с помощью ПИН-кода, это нормально, что пользователь может получить доступ к БД - это их данные.

ответ

5

Посмотрите на линии, где вы делаете databaseWithPath: (или initWithPath:), а затем добавить:

FMDatabase *db = [FMDatabase databaseWithPath:path]; 

NSDictionary *attributes = @{NSFileProtectionKey: NSFileProtectionCompleteUnlessOpen}; 
NSError *error; 
BOOL success = [[NSFileManager defaultManager] setAttributes:attributes 
               ofItemAtPath:path 
                 error:&error]; 
if (!success) { 
    NSLog(@"File protection failed: %@", error); 
} 

possible Values для ключа NSFileProtectionKey являются:

  • NSFileProtectionNone: Файл не имеет специальную защиту связанные с ним. Его можно читать или записывать в любое время.
  • NSFileProtectionComplete: Файл хранится в зашифрованном виде на диске и не может быть считан или записан, пока устройство заблокировано или загружено.
  • NSFileProtectionCompleteUnlessOpen: Файл хранится в зашифрованном виде на диске. Файлы могут быть созданы, когда устройство заблокировано, но после закрытия невозможно открыть снова, пока устройство не будет разблокировано. Если файл открывается при разблокировке, вы можете продолжить доступ к файлу в обычном режиме, даже если пользователь заблокирует устройство. Существует небольшое ограничение производительности при создании и открытии файла, хотя не при написании или чтении. Это можно смягчить, изменив защиту файла на NSFileProtectionComplete, когда устройство разблокировано.
  • NSFileProtectionCompleteUntilFirstUserAuthentication: Файл хранится в зашифрованном виде на диске и не может быть доступен до тех пор, пока устройство не загрузится. После того, как пользователь впервые откроет устройство, ваше приложение сможет получить доступ к файлу и продолжить доступ к нему, даже если пользователь впоследствии заблокирует устройство.

Правильный тип защиты может зависеть от версии iOS (последние две из них недоступны на iOS 4) и используете ли вы свою базу данных, когда устройство заблокировано.

+0

Означает ли это, что файл НЕ зашифрован, если пользователь не указал PIN-код устройства? – Oli

3

Самым простым способом является включение защиты данных для всего приложения. Перейдите на страницу App IDs, нажмите «Изменить» и установите «Общий доступ и разрешения» на «Полная защита».

enter image description here

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

+0

Спасибо, можно ли использовать защиту данных для конкретного файла sqlite? – ConfusedNoob

+0

Да, используя '[NSFileManager setAttibutes:]' с 'NSFileProtectionKey: NSFileProtectionComplete'. См. Стр. 18 этого пресо: https://github.com/rnapier/practical-security/blob/master/Practical%20Security.pdf. –

+0

@RobNapier, если я использую ваш подход и включите защиту данных для всего приложения, мне нужно установить 'NSFileProtectionKey: NSFileProtectionComplete' в файле базы данных sqlite? И будет ли фоновый доступ с фоном контекста в работе с основными данными? – mrd

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