C++
SQLite3
cocos2d-x
SQLCipher

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

More than 3 years have passed since last update.

元ブログ、【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を利用するアプリをリリースしている際は一手間必要かもしれませんね。

誰かのお役に立てば。