SQLCipherを使用してデータベースを暗号化する(FMDBを使用する・暗号化の確認)その2

SQLCipherを使用してデータベースを暗号化する。(iOS)その1の続き
で暗号化出来ているかの確認するためやsqlでのテーブル作成を簡単にするためにも
上で作ったSQLCipherAppにFMDBを追加します。

FMDBダウンロードする。右の方の[☁︎Download ZIP]をおす。
https://github.com/ccgus/fmdb

解凍してsrcフォルダのfmdb.m以外が必要になります。FMDBフォルダを作ってそこに入れましょう。
FMDB67576.png

プロジェクトにもFrameworksにカーソルを持っていき右クリック->New Groupを選択してFMDBフォルダを作ります。
次にFMDBフォルダにカーソルを持っていき右クリック->Add File to...を選択して、さきほど作った作ったFMDBフォルダの中身を入れましょう。
FMD268153.png

SQLCipherを使用している場合はlibsqlite3.0.dylibは不要になります。
ViewController.mを下のコードにする。



#import "ViewController.h"
#import "FMDatabase.h"
#import "FMDatabaseAdditions.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.


NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
stringByAppendingPathComponent: @"sqlcipher.db"];
sqlite3 *db;
NSLog(@"暗号化されたdbのリンク先%@",databasePath);
if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) {
const char* key = [@"BIGSecret" UTF8String];
sqlite3_key(db, key, strlen(key));//keyの設定
if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
// password is correct, or, database has been initialized
NSLog(@"成功");
} else {
// incorrect password!
NSLog(@"失敗");
}

sqlite3_close(db);
}

FMDatabase *dba = [FMDatabase databaseWithPath:databasePath];
NSString* sql = @"CREATE TABLE IF NOT EXISTS table (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);"
[dba open];
[dba setKey:@"BIGSecret"];//照合
[dba executeUpdate:sql];
[dba close];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end


これでsqlcipher.dbにtableというテーブルが作成されました。
このsqlcipher.dbはログに表示されたパスの場所にあります。
そこからデスクトップにコピーします。中身を見るにはターミナルを起動して、cd Desktop/でデスクトップに移動して、
hexdump -C sqlcipher.db をすると、暗号化されたデータが表示されるので、簡単には分かりそうには無いと思います。
暗号化

下の画像のように暗号化なしの場合はどのような構造をしているか分かってしまいます。
暗号化なし

メモ

・sqlite3
- int sqlite3_key(sqlite3 *db, const void *pKey, int nKey)
    key(暗号化パスワード)が設定されてない場合keyを設定する。もしくはkeyが設定されている場合keyを照合する。

- int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey)
    key((暗号化パスワード)の変更、 sqlite3_rekey("", 0); で暗号化の解除が出来る。



・FMDB
- (BOOL) setKey:(NSString*)key
    key((暗号化パスワード)が設定されてない場合keyを設定する。もしくはkeyが設定されている場合keyを照合する。

- (BOOL) setKey:(NSString*)key
    key(暗号化パスワード)の変更。解除方法?

SQLCipherを使用してデータベースを暗号化する。(iOS)その1

データベースと言っても、サーバーに上げるデータベースでは無く、plistファイルのようにアプリケーションのDocumentsにdbファイルを作る事に成ります。私の場合はセーブデータを暗号化して簡単に改ざんできないようにするためです。
暗号化するのにSQLCipherの商用版ライブラリを使えば簡単にできる?のか分かりませんが有償です。無償で使うには、オープンソースを無料で配布しているので、それを自分でビルドする事で暗号化できるそうです。
商用で利用するにはライセンス明記が必要になるそうです。

・ライセンスページ
http://sqlcipher.net/license/

・iOSとMac OS Xの統合のチュートリアル
http://sqlcipher.net/ios-tutorial

1.
では、まず最初に適当なところにプロジェクトを入れるフォルダを作成します。
自分の場合Documents(書類)にcodeというフォルダを作る事にします。
/Users/(ユーザー名)/Documents/code

2.
次に下のURLから openssl-1.0.1f.tar.gz をダウンロードします。(opensslの最新版だと思います)
ftp://ftp.openssl.org/source/

openssl-xcodeをダウンロードします。右の方の[☁︎Download ZIP]をおします。
https://github.com/sqlcipher/openssl-xcode

sqlcipherをダウンロードします。右の方の[☁︎Download ZIP]をおします。
https://github.com/sqlcipher/sqlcipher

ダウンロードしたのを解凍して先ほど(1で)作ったフォルダ(/Users/(ユーザー名)/Documents/code)に入れます。こんな感じです。
フォルダcode0027


3.
次にxcodeを起動します(プロジェクトを作らなくていいです)。上のバーのXcode->Prefencesを選択
xcode-prefen2537.png

Locations->Source Treesを選択
OPENSSL_SRCのパスを作ります。
自分の場合パスは
/Users/(ユーザー名)/Documents/code/openssl-1.0.1f
と成ります。
codelink6587.png


4.
次に新規にプロジェクトを作成していきます。別になんでもいいですがSingleViewApplicationで作成するとします。
ProductNameはSQLCipherAppにします。デスクトップに作成します。
先ほど(2で)ダウンロードした。プロジェクトを追加していきます。プロジェクトを右クリックしてAdd Files To "SQLCipherApp"...を選択します。
AddFile28319.png


Add to targetsは一応全部にチェックを入れておく
sqlcipher.xcodeprojをAdd (場所:書類/code/sqlcipher-master/sqlcipher.xcodeproj)
sqlcipherxcodeproj37184.png


openssl.xcodeprojをAdd(場所:書類/code/openssl-xcode-master/openssl.xcodeproj)
openssl-xcode13289.png


5.
1SQLCipherApp->2TARGETS-SQLCipherApp->3BuildPhaseを選択
4Target Dependenciesの+を押して、cryptoz(openssl)、sqlcipher(sqlcipher)を追加する。
5Link Binary Whith Librariesの+を押して、libcrypto.a、libsqlcipher.aも追加しておく。(sqlite3またはFMDBを先に導入していた時「libsqlite3.dylib」が含まれている場合は取り除く、プロジェクトを新規作成している場合は気にしなくていい)
build21673.png

6.
1SQLCipherApp->2PROJECT-SQLCipherApp->3Build Setting
4Other C FlagsのDebug、Releaseに -DSQLITE_HAS_CODEC を追加(書き込む)する。(検索エリアでOther C Flagsを入力して抽出している)
DSQLITEd2138.png

7.
ビルド(⌘+B)する。少し時間がかかるが警告も何も無かったら一応成功。
公式のチュートリアルのソースを参考にして実行してみる。
http://sqlcipher.net/ios-tutorial
ViewController.mにsqlite3.hをimportして、- (void)viewDidLoadにコピペする

下のコードをViewController.mにコピペ

#import "ViewController.h"
#import "sqlite3.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.


NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
stringByAppendingPathComponent: @"sqlcipher.db"];
sqlite3 *db;
NSLog(@"暗号化されたdbのリンク先:%@",databasePath);
if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) {
const char* key = [@"BIGSecret" UTF8String];
sqlite3_key(db, key, strlen(key));
if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
// password is correct, or, database has been initialized
NSLog(@"成功");
} else {
// incorrect password!
NSLog(@"失敗");
}

sqlite3_close(db);
}
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end


上のコードを実行するとログに 「暗号化されたdbのリンク先:/Users/...」 と「成功」という文字が表示されるはずです。
/Users/...のパスの場所にはsqlcipher.dbのファイルがあるまでのパスです。
成功という文字が出たらデータベース初期化、暗号化に成功したという事です。

この場合パスワードはBIGSecretになる。
FMDBをで使う場合Frameworksにlibsqlite3.0.dylibを追加しなくてよく、
[db setKey:@"BIGSecret"];
を[db open];の後に挿入したら、普通に使えるはず。
ここまで一応作りながら書いたので成功するはずです。エラーが出たら見直しが必要かもしれません。

備考
一応openssl->Build Settings->Base SDKがOS Xに成っていたので Latest iOS(iOS 7.0)に変えておく。
Latest iOS231827


参考にさせて頂いたサイト
SQLCipher:SQLite暗号化対応ライブラリ
http://labs.torques.jp/2012/11/19/3018/

[iPhone]sqlcipherを利用する。(その2)
http://otuji.blog97.fc2.com/blog-entry-220.html#comment4

iOS and Mac OS X Integration Tutorial
http://sqlcipher.net/ios-tutorial


SQLCipherを使用してデータベースを暗号化する(FMDBを使用する・暗号化の確認)その2に続く


備考2
新規じゃなく既存のプロジェクトにSQLCipherを追加した場合、以下のようなエラーが発生しました。

Undefined symbols for architecture i386:
"_SecRandomCopyBytes", referenced from:
_sqlcipher_cc_random in libsqlcipher.a(sqlite3.o)
"_kSecRandomDefault", referenced from:
_sqlcipher_cc_random in libsqlcipher.a(sqlite3.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

errori386jsds.png

これを消すためにはなぜか、sqlcipher,xcodeprojにSecurity.frameworkがあるはずなんですが、リンクが通って無いのか分かってないのですが、Security.frameworkをもう一つ追加する事で解決しました一応。
errooi386.png

現状見た目は二つあるのですがエラーがでないので分からない以上ほっとく事にします。
Securityframework222.png


参考URL
SQLCipher compiled error
http://stackoverflow.com/questions/20740612/sqlcipher-compiled-error
上のサイトをgoogle翻訳
http://translate.googleusercontent.com/translate_c?depth=1&hl=ja&prev=/search...
検索フォーム
プロフィール

mihumo

Author:mihumo
FC2ブログへようこそ!

最新記事
月別アーカイブ
カテゴリ
ブロとも申請フォーム

この人とブロともになる

最新コメント
最新トラックバック
リンク
RSSリンクの表示
Amazon
楽天
QRコード
QR