CoreDataはSQLiteのラッパーのような位置づけのものなので、SQLiteのデータベースの暗号化してくれるSQLCipherを使うやり方を紹介します。

とは言え、SQLCipherの使い方を見ると、SQLiteを直接操作してコードを書いているものに対しての使い方になっているので、CoreDataを使っていると単純にはSQLCipherが使えないようです。

そこで、調べてみると、encrypted-core-dataというCoreData越しにSQLCipherを使ってデータベースの暗号化をするライブラリがありました。

以下にその手順を紹介します。

1.CocoaPodsをインストールする
# sudo gem install cocoa pods

2.対象のXcodeプロジェクトにCocoaPodsを使えるようにする
対象のXcodeプロジェクトフォルダで
# pod init
# pod install

3.SQLCipherをビルドする
sqlcipherからDownload ZIPでソースコードを取得。
xcodeprojを開いてビルドします。

4.sqlcipherのプロジェクトを対象のプロジェクトに取り込む
File -> Add Files to "対象のプロジェクト名"を選択して、sqlcipher.xcodeprojを選択します。

5.ライブラリをインポート&ビルドオプションの追加
・プロジェクトのTARGETS -> Target Dependenciesから、sqlcipherを追加。
・プロジェクトのTARGETS -> Link Binary With Librariesから、libsqlcipher.a、Security.frameworkを追加。
・プロジェクトのTARGETS -> Build Settings -> Custom Compiler Flagsに「-DSQLCIPHER_CRYPTO_CC -DSQLITE_HAS_CODEC」を設定。

6.encrypted-core-dataをcloneする
対象のXcodeプロジェクトフォルダで
# git clone https://github.com/project-imas/encrypted-core-data.git

7.encrypted-core-dataを対象のプロジェクトに取り込む
File -> Add Files to "対象のプロジェクト名"を選択して、encrypted-core-dataを選択します。
一緒に取り込まれたexampleProjectsは不要なので削除します。

8.encrypted-core-dataを対象のプロジェクトにインポートする
#import "EncryptedStore.h"と書けばいいだけなのですが、swiftからObjective-Cのヘッダをインポートするにはひと手間かかります。
・swiftとObjective-Cをブリッジさせるためのファイルを追加。
・File -> New -> File... -> iOS -> Source > Header Fileを選択し、名前をBriage-Header.h等に設定。
・Bridge-Header.hに「#import "EncryptedStore.h"」を追記。
・プロジェクトのTARGETS -> Build Settings -> packaging -> Defines Moduleを「YES」に設定。
・プロジェクトのTARGETS -> Build Settings -> Swift Compiler - Code Generation -> Objective-C Bridging Headerに「Bridge-Header.h」を設定。

9.EncryptedStoreクラスを使って暗号化
AppDelegate.swiftを以下のように修正します。
修正前)let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)

修正後)let coordinator = EncryptedStore.makeStore(self.managedObjectModel, passcode: "任意のパスコード")


以上で設定が完了となります。
後はいつも通りにCoreDataを使うだけです。
CoreDataの使い方は、「[swift]CoreDataの使い方(追加、読込、更新、削除をする)」で紹介しています。