Как я могу зашифровать содержимое CoreData на iPhone - PullRequest
46 голосов
/ 29 октября 2009

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

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

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

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

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

Ответы [ 9 ]

72 голосов
/ 30 октября 2009

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

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

8 голосов
/ 18 мая 2011

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

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

4 голосов
/ 18 июля 2014

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

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

4 голосов
/ 10 ноября 2010

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

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

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

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

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

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

4 голосов
/ 29 апреля 2010

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

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

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

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

3 голосов
/ 13 сентября 2014

«Целью шифрования является предотвращение доступа к данным, если пользователь потеряет телефон».

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

Пример:

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

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

0 голосов
/ 12 августа 2013

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

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

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

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

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

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

0 голосов
/ 29 октября 2009

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

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

0 голосов
/ 29 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...