17
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

誰かのお役に立てば。

17
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?