【c++】SQLCipherを導入してみた


元ブログ、【c++】SQLCipherを導入してみた - 技術は熱いうちに打て!

SQLiteはただのファイルですので高度な知識を持った
ユーザには中身を見られたり改竄される恐れがあります。
このSQLiteを暗号化する一つの手法として2008年8月にリリースされたSQLCipherです。

Full Database Encryption for SQLite
オープンソースであり、SAMSUNGやxeroxを始め様々な企業に導入されているそうです。

今日はこれの導入方法について書きます。

無償で使うには

SQLCipherは有償です。
ですが、それは予めビルドされたライブラリを導入する場合です。
1developer辺り499$です。(2015/03/10時点)

ですが、ライセンスを明記した上で自分でソースコードからビルドすれば無償で使うことも可能です。
では、ソースコードからビルドして使ってみましょう!

開発環境

OS X 10.10.2
XCode6.1.1
C++11

ダウンロード

openssl

現状最新は1.0.2ですのでこれをダウンロードします。

$ curl -o openssl-1.0.2.tar.gz http://www.openssl.org/source/openssl-1.0.2.tar.gz
$ tar xzf openssl-1.0.2.tar.gz

SQLCipher

$ git clone https://github.com/sqlcipher/sqlcipher.git

openssl-xcode

$ git clone https://github.com/sqlcipher/openssl-xcode.git

パスの追加

Xcodeで[Xcode] - [Preferences] - [Locations] - [Source Trees]に以下を追加します。

[Name] - OPENSSL_SRC
[Display Name] - OPENSSL_SRC
[Path] - (例) $(PROJECT_DIR)/../libs/openssl-1.0.2

Locations_example

プロジェクトの追加

gitでcloneしてきたフォルダ内のxcodeprojをプロジェクトに追加します。
この際、
ドラッグアンドドロップではなく[プロジェクトを右クリック] - [Add Files to "ProjectName"]で追加する様にしてください。

そして、targetにチェックが付いている事を確認してAddをクリックします。

Build Phasesの設定

Target Dependencies

[Project] - [Build Phases] - [Target Dependencies]で
cryptoとsqlicipherを追加します。

Add_items

Link Binaries With Libraries

[Project] - [Build Phases] - [Link Binaries With Libraries]でlibcrypto.aとlibsqlicipher.aを追加します。

Add_frameworks_and_libraries

C フラグの設定

[Project] - [Build Settings] - [Other C Flags]の全Build Configuration分-DSQLITE_HAS_CODECを追加します。

other_c_flags

ビルド!

ここまできたらビルドしてみてください。
上手く設定出来ていればコンパイルは通るはずです。

コードで導入

とても簡単です。

string dbName = "test.db";
auto filePath = FileUtils::getInstance()->getWritablePath() + dbName;

auto status = sqlite3_open(filePath.c_str(), &db);
string key = "v179g41b3u14b8710fb23fb38";
sqlite3_key(db, key.c_str(), static_cast<int>(strlen(key.c_str())));

データベースをopenした後にsqlite3_keyを実行するだけです。
この例で言えばv179g41b3u14b8710fb23fb38がパスワードになります。

注意

一つだけ注意があります。

当たり前と言えば当たり前なのですが、
上で示した sqlite3_keyはdatabase作成時に実行されなければなりません。
言い換えれば作成されているdatabaseに途中からSQLCipherを充てることは出来ません。

なので、もうSQLiteを利用するアプリをリリースしている際は一手間必要かもしれませんね。

誰かのお役に立てば。