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