Как я могу зашифровать содержимое CoreData на iPhone

У меня есть информация, которую я хотел бы хранить статически зашифрованной в приложении iPhone. Я новичок в разработке iPhone, некоторые я не очень хорошо знаком с CoreData и как он интегрируется с представлениями. У меня есть данные как JSON, хотя я могу легко поместить его в базу данных SQLITE3 или любой другой формат данных поддержки. Я возьму то, что проще всего (а) зашифровать, и (б) интегрироваться с уровнем просмотра iPhone.

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

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

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

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

Ответ 1

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

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

Ответ 2

Вам нужно зашифровать? Новые iPhone (3Gs, 4, iPad...) шифруют все данные на устройстве. С одним, хэшированным, соленым паролем в вашем приложении никто не может получить данные без пароля. Данные изолированы от всех других приложений.

Защита данных в iOS

Ответ 3

Мне удалось адаптировать Apple CustomAtomicStoreSubclass примерный код для использования в настольном приложении Mac, в результате чего зашифрованное хранилище в стиле NSBinaryStore записанный как один файл в файловой системе. Мой подход:

  • Скопируйте исходный код класса CustomAtomicStoreSubclass и CustomAtomicStoreSubclassCacheNode в мой проект и переименуйте их
  • Сохраните ключ и начальный вектор в цепочке ключей
  • Используйте библиотеку OpenSSL в комплекте с Mac OS X
  • Зашифровать вывод NSKeyedArchiver и записать зашифрованный текст на диск (дешифрование является обратным)

Я перехватил резервное хранилище, которое читает и записывает в методах readFile, metadataForPersistentStoreWithURL:error:, setMetadata:forPersistentStoreWithURL:error: и save: в CustomAtomicStoreSubclass.

Замечания о подклассе для ссылки на класс NSAtomicStore для iPhone аналогичны рекомендациям Mac OS X. Возможно, такой подход может также работать с iPhone.

Ответ 4

Я знаю, что это старый вопрос, но он по-прежнему весьма уместен, и мне недавно пришлось самому заниматься этим вопросом.

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

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

  • Расшифровать хранилище в временном файле
  • Обычно загружать расшифрованный магазин
  • Перенос хранилища в хранилище в памяти
  • Удалить незашифрованное хранилище

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

Основной файл данных, с которым я работал, был ~ 1 МБ и очень быстро зашифрован/расшифрован.

Ответ 5

В настоящее время я использую https://github.com/project-imas/encrypted-core-data для шифрования моего хранилища coredata. Это обычная реализация NSIncrementalStore в основном является заменой сообщества для собственного хранимого хранилища Apple, имеющего опцию шифрования. Это заходное решение, которое работает. Вы также можете извлечь файл sqlite и расшифровать его любым кодом доступа, который вы выберете для разных клиентов.

Реализация не имеет покрытия 100% и не позволяет использовать некоторые функции, такие как предикаты подзапроса. Я должен отправить свой первый PR на репо, чтобы скоро пообещать изменения;-). Я почти доработал его с помощью очень сложного приложения coredata. Он также имеет дополнительное преимущество, позволяющее вам напрямую обращаться к SQLite, не беспокоясь о том, что реализация Apple изменилась, поскольку у вас есть полный доступ к исходному коду.

Ответ 6

"Цель шифрования - сохранить доступность данных, если пользователь теряет телефон".

iOS Защита данных с iOS 4, а Core Data долгое время поддерживала это. Защита данных предназначена именно для тех типов сценариев, которые вас интересуют. По умолчанию в файлах Core Data NSSQLiteStoreType есть NSFileProtectionCompleteUntilFirstUserAuthentication для приложений, созданных с помощью API iOS 5 или более поздней версии. Сеанс WWDC 2012 Защита пользовательских данных более подробно рассматривается в этой теме и рекомендует использовать NSFileProtectionComplete. Вы можете использовать это с Core Data, передав это значение в словаре опций, используемом для открытия хранилища Core Data NSSQLiteStoreType.

Пример:

NSDictionary *storeOptions = @{ NSPersistentStoreFileProtectionKey : NSFileProtectionComplete };
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeURL] options:storeOptions error:&error]){

Более широкая тема безопасности устройств описана в IOS Device Security

Ответ 7

Как шифровать или расшифровывать данные?

"API сертификата, ключа и доверенных служб предоставляет функции для генерации симметричных и асимметричных ключей шифрования, создания и проверки цифровых подписей, а также шифрования ключей и несов. Библиотека CommonCrypto используется для симметричного шифрования, хэширования и операций HMAC. Обратитесь к Справочник по сертификатам, ключам и службам доверия и CC_crypto ( 3cc) для получения дополнительной информации.

Ответ 8

Вы можете использовать Trasformables, и я подтверждаю, что вы не можете использовать их с предикатами, но (и это хуже) вы даже не можете использовать

... = [self primitiveValueForKey: @ "crypted_data" ];

если вы используете предикаты..

он отлично работает, если вы склеиваете данные, используя:

[self setPrimitiveValue:cryptedPsw forKey:@"crypted_data"];

для шифрования данных. (и, например, на симуляторе.... и позже перейдем к пакету проекта.)

Ответ 9

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