元ブログ、【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
プロジェクトの追加
gitでcloneしてきたフォルダ内のxcodeprojをプロジェクトに追加します。
この際、
ドラッグアンドドロップではなく[プロジェクトを右クリック] - [Add Files to "ProjectName"]で追加する様にしてください。
そして、targetにチェックが付いている事を確認してAddをクリックします。
Build Phasesの設定
Target Dependencies
[Project] - [Build Phases] - [Target Dependencies]で
cryptoとsqlicipherを追加します。
Link Binaries With Libraries
[Project] - [Build Phases] - [Link Binaries With Libraries]でlibcrypto.aとlibsqlicipher.aを追加します。
C フラグの設定
[Project] - [Build Settings] - [Other C Flags]の全Build Configuration分-DSQLITE_HAS_CODECを追加します。
ビルド!
ここまできたらビルドしてみてください。
上手く設定出来ていればコンパイルは通るはずです。
コードで導入
とても簡単です。
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を利用するアプリをリリースしている際は一手間必要かもしれませんね。
誰かのお役に立てば。