現在作成中のアプリではSQLiteを使っているのですが,このアプリではdbの中身を書き換えられるとバランスが崩れてしまうのです.そこで,SQLiteを暗号化してしまって簡単に中身を書き換えられないようにしてみようと思います.
今回使うのはSQLCipherという暗号化ライブラリです.SQLCipherは自分でビルドして,ライセンスを明記すれば商用でも利用できるとのこと.個人開発ということでできるだけお金をかけたくないので嬉しいライブラリです.
基本的には公式の方法に従います
ここまで実行すると写真のようになっていると思います.
2.「Locations」タブを選択します.
3.写真のようにName,Display Nameを入力し,PathにOpenSSLを指定します.
例:/Users/(ユーザ名)/Developer/cipherTest/openssl-1.0.0e
追加する時は下記のようにして下さい.
追加するプロジェクトは2つです.
追加後の状態です.
同じく「Build Phases」の下部に「Link Binary With Libraries」があるので,ここから「libcrypto.a」と「libsqlcipher.a」を追加します.
「Debug」と「Release」に「-DSQLITE_HAS_CODEC」を追加します.
そういう時は,プロジェクトごとにビルドしていくとうまくいくと思います.また,openssl.xcodeprojに関してはデフォルトのBaseSDKがiOSになっていませんでしたので変更しました.
libcrypto.aはMy Mac 64-bitに変更してビルドすると赤文字→黒文字になります(これはしなくても動作しましたが,赤が気になる時は,という程度です
せっかくここまで準備してきたのに,上のようなCocos2d-xでsqliteを操作するコードを書くとエラーが出て,絶望に浸っていました.どうやら,sqlcipher.xcodeprojにはSecurity.frameworkが入っているのですが,私の場合ですとCipher-Cocos2dxプロジェクトにSecurity.frameworkが入っていなかったことが原因だったようです.これを「Linked Frameworks and Librayies」から追加するとエラーが無事消えてうまく利用できるようになりました.
11.その他エラー
このようなエラーが出た場合は4番目のOPEN_SSLのパスの追加部分で,パスが間違っている可能性があります.空白が入っていたり,パスのコピーをミスして改行が入っていたりと気づかなかったりします.改行が入っていた場合は,本当に気づきにくいです.
今回使うのはSQLCipherという暗号化ライブラリです.SQLCipherは自分でビルドして,ライセンスを明記すれば商用でも利用できるとのこと.個人開発ということでできるだけお金をかけたくないので嬉しいライブラリです.
開発環境
OS X 10.9.3 Marvericks
Cocos2d-x v3.0
Cocos2d-x v3.0
基本的には公式の方法に従います
1.OpenSSLをDL
terminal
$ 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
$ tar xzf openssl-1.0.0e.tar.gz
2.SQLCipherをDL
terminal
$ git clone https://github.com/sqlcipher/sqlcipher.git
3.OpenSSL-XcodeをDL
terminal
$ git clone https://github.com/sqlcipher/openssl-xcode.git
ここまで実行すると写真のようになっていると思います.
4.パスを追加する
1.Xcodeを起動して,上部のバーから「Preferences...」を選択します.2.「Locations」タブを選択します.
3.写真のようにName,Display Nameを入力し,PathにOpenSSLを指定します.
例:/Users/(ユーザ名)/Developer/cipherTest/openssl-1.0.0e
5.プロジェクトを作成&追加する
既に作成しているプロジェクトにSQLCipherを導入したい場合は新規にプロジェクトを作成する必要はありません.それでは,既存プロジェクトに先ほどDLしたプロジェクトを追加していきます.追加する時は下記のようにして下さい.
追加するプロジェクトは2つです.
追加後の状態です.
6.Build Phases
xcodeの「Build Phases」に「Target Dependencies」があるので,ここから「sqlcipher」と「crypto」を追加します同じく「Build Phases」の下部に「Link Binary With Libraries」があるので,ここから「libcrypto.a」と「libsqlcipher.a」を追加します.
7.-DSQLITE_HAS_CODECを追加する
xcodeの「Build Settings」で「other c flag」と検索すると必要な項目が出てきます.「Debug」と「Release」に「-DSQLITE_HAS_CODEC」を追加します.
8.ビルドしてみる
うまくビルドできれば下記のようになります.もし,赤文字から黒文字に変わってない場合はビルドができていません.そういう時は,プロジェクトごとにビルドしていくとうまくいくと思います.また,openssl.xcodeprojに関してはデフォルトのBaseSDKがiOSになっていませんでしたので変更しました.
libcrypto.aはMy Mac 64-bitに変更してビルドすると赤文字→黒文字になります(これはしなくても動作しましたが,赤が気になる時は,という程度です
9.エラーが出る
Code
const char* key = [@"BIGSecret" UTF8String];
sqlite3_key(db, key, strlen(key));
せっかくここまで準備してきたのに,上のようなCocos2d-xでsqliteを操作するコードを書くとエラーが出て,絶望に浸っていました.どうやら,sqlcipher.xcodeprojにはSecurity.frameworkが入っているのですが,私の場合ですとCipher-Cocos2dxプロジェクトにSecurity.frameworkが入っていなかったことが原因だったようです.これを「Linked Frameworks and Librayies」から追加するとエラーが無事消えてうまく利用できるようになりました.
10.速度
SQLCipherを利用すると,利用していない時と比べてデータへのアクセス速度がかなり落ちます.ですので頻繁にdbへアクセスするようなコードを書くと,アプリが非常につかいずらくなってしまうので気をつけた方が良さそうです.11.その他エラー
Error Code
Shell Script invocation error
cp: libssl.a: No such file or directory
cp: libssl.a: No such file or directory
line 66: ./config: No such file or directory
このようなエラーが出た場合は4番目のOPEN_SSLのパスの追加部分で,パスが間違っている可能性があります.空白が入っていたり,パスのコピーをミスして改行が入っていたりと気づかなかったりします.改行が入っていた場合は,本当に気づきにくいです.