Защита данных с использованием основных данных в iOS

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

1) Мне нужно зашифровать все хранящиеся мной данные с помощью Core Data, но я не нашел отправной точки для достижения этого. В Руководстве по программированию основных данных они говорят, что:

Core Data не дает никаких гарантий относительно безопасности постоянных хранилищ от ненадежных источников и не может определить, были ли файлы изменены злонамеренно. Магазин SQLite предлагает немного лучшую безопасность, чем XML и двоичные магазины, но он не должен считаться неотъемлемо безопасным. Обратите внимание, что вы также должны учитывать безопасность метаданных хранилища, поскольку данные, заархивированные в метаданных, могут быть изменены независимо от данных хранилища. Если вы хотите обеспечить безопасность данных, вы должны использовать такую ​​технологию, как зашифрованный образ диска.

Это не дает мне понять, что я должен делать... Я также взглянул на Обзор безопасности Но этот документ, похоже, не имеет отношения к Core Data. Однако они упоминают Data Protection для защиты файлов, но я не уверен, что это то, что я действительно ищу... должен ли я использовать Data Protection для файла SQLite, с которым работает Core Data?

Мне нужно некоторое руководство о том, как я могу зашифровать все сохраненные данные Core Data, пожалуйста,

2) Если лучше хранить пароли пользователей в цепочке ключей, а не шифровать и хранить их с помощью Core Data?

Заранее спасибо

Ответ 1

Так как iOS 5, постоянные хранилища Core Data использовали Data Protection для шифрования данных по умолчанию. Из примечаний к выпуску iOS 5:

Для приложений, созданных для iOS 5.0 или новее, постоянные хранилища теперь хранят данные по умолчанию в зашифрованном формате на диске. Уровень защиты по умолчанию предотвращает доступ к данным до тех пор, пока пользователь не разблокирует устройство в первый раз. Вы можете изменить уровень защиты, назначив настраиваемое значение ключу NSPersistentStoreFileProtectionKey при настройке постоянных хранилищ. Дополнительные сведения о новой защите данных в iOS 5.0 см. В разделе "Улучшения защиты данных".

Это также рассматривается в сессии WWDC 2011 "Что нового в основных данных".

Как наилучшая практика, имена пользователей и пароли должны храниться в цепочке ключей. Если вы храните имя пользователя и пароль для удаленной службы (например, HTTP-сервер, FTP-сервер и т.д.), Предпочтительнее использовать цепочку ключей через NSURLCredentialStorage API.

Ответ 2

Проект encrypted-core-data имеет ограничения для средних и сложных моделей данных. В моем приложении iOS у нас было несколько отношений "многие ко многим" и некоторые отношения "один ко многим" между определенными объектами.

Код моста (код, который соединяет основные данные с SQLCihper) имеет недостатки, такие как реализация NSOrderedSet. Изменение кода моста было для нас очень дорогостоящим.

Итак, мы решили зашифровать конфиденциальные данные в столбце. Таким образом, для этого мы использовали базовую способность основных данных transformable attributes и использовали криптографическую библиотеку для шифрования атрибута объекта. Эта возможность шифрует данные, когда они идут в столбец, и расшифровывает их при чтении. Это делается автоматически.

Это приводит нас к проблемам производительности тогда, когда мы запрашиваем данные по нескольким строкам, чтобы отображать их в виде списка. Чтобы решить эту проблему, мы затем восстанавливаем тип столбца в обычный тип string, а затем выполняем шифрование и дешифрование вручную в коде, но только тогда, когда это необходимо. Мы также используем переходный атрибут в модели для хранения расшифрованной формы. Это помогает нам в восстановлении производительности до приемлемого уровня.

Я все еще ищу лучший способ шифровать всю базу данных при использовании основных данных.

Ответ 3

Вы можете использовать что-то вроде encrypted-core-data, которое является оболочкой аксессуаров Core Data вокруг SQLite Cipher.

Это подкласс NSIncrementalStore, который взаимодействует с зашифрованной базой данных.

Если вы просто храните пароли, то ключ-ключ лучше, но если вы хотите зашифровать хранилище Core Data, то лучший вариант.

Ответ 4

"2. Если лучше хранить пароли пользователей в цепочке ключей, а не шифровать и хранить их с помощью Core Data?"

Да, для этого нужен брелок. Вероятность того, что вы можете создать более безопасное хранилище, чем брелок, минимальна. Даже в случае iOS с Jailbroken все еще есть тайм-ауты безопасности, которые невозможно получить, минимальное время для попытки доступа.