SQLCipher:SQLite暗号化対応ライブラリ

Filed under iOS SDK, iPhoneアプリ
Tagged as , ,

SQLiteのDBファイルを暗号化したい、と思って調べ、SQLCipherを利用できるようにするまでのエントリです。
SQLite Logo

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

ビルドの準備

作業用のディレクトリは、なんという名前でもいいのですが、私の場合、自分ルールで、/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を追加するのですが、これは公式サイトに載っている下図が分かりやすいですね。
Project References
Xcodeの”File”メニュー→”Add Files to “SQLCipherTest”…”を選び、上図のように設定し読み込むと、次の図のようになり、左のペインにプロジェクトが追加されます。

プロジェクト「SQLCipherTest」の“Build Phases”→”Target Dependencies”に、opensslと、sqlcipherを追加します。これも公式サイトの数が分かりやすいです。
Build Dependencies
続けて、“Link Binary With Libraries”で、”Workspace”にある、libcrypt.aと、libsqlcipher.aを追加します。
ここで注意すべきは、libsqlite3.dylibは選択していないことを再確認してください。とのこと。

Other C Flagsに、”-DSQLITEHASCODEC” を、Debug, Release共に設定します。
C Flags
これで基本設定は完了ですので、一旦ビルドできることを確認しておきましょう。

使ってみる

チュートリアルサイトにあるコードをコピーして、実行してみましょう。

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のリファレンス。

SQLite ポケットリファレンス

著者/訳者:五十嵐 貴之

出版社:技術評論社( 2010-10-22 )

定価:¥ 2,604

Amazon価格:¥ 2,604

単行本(ソフトカバー) ( 336 ページ )

ISBN-10 : 4774143944

ISBN-13 : 9784774143941


↓日本全県味巡り 島根編!

美味しんぼ 109 (ビッグ コミックス)

著者/訳者:雁屋 哲

出版社:小学館( 2012-10-30 )

定価:¥ 620

Amazon価格:¥ 620

コミック ( 264 ページ )

ISBN-10 : 4091847285

ISBN-13 : 9784091847287


Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*