SQLiteのDBファイルを暗号化したい、と思って調べ、SQLCipherを利用できるようにするまでのエントリです。
SQLiteの暗号化ライブラリ
SQLiteには暗号化の手順は決められているのですが、オフィシャルの暗号化ライブラリ“SEE”がありました。
しかし、なんと有償!
The cost of a perpetual source code license for SEE is US $2000.
ですって!
エンタープライズな開発ならいいけど、個人の利用には、、ちょっと高いわー・・。
という感じで、他にもいくつか探してみました。
今回はiOSアプリで使いたかったのでその条件で絞りこまれたのが“SQLCipher”です。
ライブラリをバイナリでも配布していますが、これは“Commercial Edition”というもので有償。
Mac OS X用のライブラリが $150、iOS用のライブラリが $150という感じです。
もう一つ“Community Edition”というものがあり、よく読んでみると、自分でビルドする必要があるけど、ライセンスを明記したら商用利用にも使える、らしい!
で、頑張って使えるようにしてみた顛末が下記の長いエントリとなります。
参考URL
- sqlcipher/sqlcipher – github
- SQLCipher for iOS – SQLCipher .. 今回、一番参考になったページ
- SQLCipher Users – Google グループ
ビルドの準備
作業用のディレクトリは、なんという名前でもいいのですが、私の場合、自分ルールで、/prj/sqlcipher/ というディレクトリを作り、そこにSQLCipher関連のファイルを置くことにしました。
1 2 | $ mkdir /prj/sqlcipher $ cd /prj/sqlcipher |
OpenSSL関連
まずは、OpenSSLの準備です。
下記のようにダウンロードしてきます。
1 2 | $ curl -o openssl-1.0.0e.tar.gz http://www.openssl.org/source/openssl-1.0.0e.tar.gz $ tar xzf openssl-1.0.0e.tar.gz |
さらに、OpenSSLをビルドするためのXcodeプロジェクトをダウンロードします。
1 | $ git clone https://github.com/sqlcipher/openssl-xcode.git |
SQLCipher関連
次に、そこに今回のメインである、sqlcipherもgithubからcloneしてきます。
1 | $ git clone https://github.com/sqlcipher/sqlcipher.git |
Xcodeの初期設定
Xcodeの初期設定も変更します。
Xcodeを開きます(何かプロジェクトを開く必要はありません)。
“Xcode”メニュー→”Preferences…”→”Locations”→”Source Trees” を開き、下図のように設定を追加します。
これで準備はOKです。
テストプロジェクトで使ってみる
実行のためのプロジェクトを作成します。
/prj/sqlcipher/ に、 SQLCipherTest というプロジェクト(Single View Application)を作ってみました。
このプロジェクトに、sqlcipher.xcodeprojと、openssl.xcodeprojを追加するのですが、これは公式サイトに載っている下図が分かりやすいですね。
Xcodeの”File”メニュー→”Add Files to “SQLCipherTest”…”を選び、上図のように設定し読み込むと、次の図のようになり、左のペインにプロジェクトが追加されます。
プロジェクト「SQLCipherTest」の“Build Phases”→”Target Dependencies”に、opensslと、sqlcipherを追加します。これも公式サイトの数が分かりやすいです。
続けて、“Link Binary With Libraries”で、”Workspace”にある、libcrypt.aと、libsqlcipher.aを追加します。
ここで注意すべきは、libsqlite3.dylibは選択していないことを再確認してください。とのこと。
Other C Flagsに、”-DSQLITEHASCODEC” を、Debug, Release共に設定します。
これで基本設定は完了ですので、一旦ビルドできることを確認しておきましょう。
使ってみる
チュートリアルサイトにあるコードをコピーして、実行してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #import <sqlite3.h> ... NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent: @"sqlcipher.db"]; sqlite3 *db; if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) { const char* key = [@"BIGSecret" UTF8String]; sqlite3_key(db, key, strlen(key)); if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) { // password is correct, or, database has been initialized NSLog(@"OK"); } else { // incorrect password! NSLog(@"ERROR."); } sqlite3_close(db); } |
これでおそらく問題なく処理できると思います。
上記コードは、アプリのドキュメントルートからsqlcipher.dbを開き(無ければ作り)(sqlite3_open)、”BIGSecret”という文字列で暗号化し(sqlite3_key)、全テーブル情報を出力するSQL文を実行し(sqlite3_exec)、暗号化されたままのDBファイルを閉じています(sqlite3_close)。
使い方のまとめ
ちょっと、使い方をまとめておきます。
暗号化されていないDBを開く
1 2 | sqlite3_open("test.db", &db); // 後は普通の処理. |
暗号化されているDBを開く
1 2 3 | sqlite3_open("test.db", &db); sqlite3_key("password_phrase", strlen("password_phrase")); // 後は普通の処理で常に暗号化されている状態. |
暗号化のパスワードを変更
1 2 3 | sqlite3_open("test.db", &db); sqlite3_key("password_phrase", strlen("password_phrase")); sqlite3_rekey("new_password_phrase", strlen("new_password_phrase")); |
暗号化を解除
1 2 3 | sqlite3_open("test.db", &db); sqlite3_key("password_phrase", strlen("password_phrase")); sqlite3_rekey("", 0); |
動作確認環境
動作を確認できた環境をメモしておきます
- Xcode 4.5.1
- Deployment Target:6.0、4.3
- デバッグ動作端末:iPhone Simulator、iPhone 3GS (iOS 4.3)、iPhone 5 (iOS 6.0.1)
※これでないと動かない、ということではなく、この環境で動かせた、という意味です
FMDatabaseも使える!
オープンソースのsqliteラッパーライブラリであるFMDatabaseを使っている人も多いと思います。
FMDatabaseは、既にkey/rekeyのメソッドの準備をしてあり、キチンとビルドフラグで分岐対応してあるので、ここまで出来ていたら普通に追加するだけで、使えます!!
1 2 3 | // FMDatabase - (BOOL)setKey:(NSString*)key; // sqlite3_keyに対応.. 成功したらYES - (BOOL)rekey:(NSString*)key; // sqlite3_rekeyに対応.. 成功したらYES |
FMDB、グッジョブ!!
[AD]
↓SQLiteのリファレンス。
著者/訳者:五十嵐 貴之
出版社:技術評論社( 2010-10-22 )
定価:¥ 2,604
Amazon価格:¥ 2,604
単行本(ソフトカバー) ( 336 ページ )
ISBN-10 : 4774143944
ISBN-13 : 9784774143941
↓日本全県味巡り 島根編!
著者/訳者:雁屋 哲
出版社:小学館( 2012-10-30 )
定価:¥ 620
Amazon価格:¥ 620
コミック ( 264 ページ )
ISBN-10 : 4091847285
ISBN-13 : 9784091847287