アプリで使用するSQLiteは書き換えられる

iFunBoxというツールを使用すると簡単にアプリで生成したファイルを閲覧したり、編集できたりしてしまいます。
iFunBox for Windows | File Manager, Browser, Explorer, Transferer for iPhone, iPad and iPod Touch

こちらに詳しく書かれています。
iPhoneアプリの初歩的なデータ書き換え・チート方法と、それを防ぐ方法 | Lancork

FMDB + SQLCipher でSQLite暗号化

SQLCipherというSQLite暗号化ライブラリを使用すると、SQLiteのファイルを暗号化し
閲覧・編集できないようにできます。
FMDBでSQLiteを使用している場合は、SQLCipherを簡単に組み込むことができます。

SQLCipherは有料で結構なお値段しちゃいます。
Buy SQLCipher – Zetetic

でも、SQLCipher Community Editionであれば、無料だし、BSDライセンスで利用できます。
SQLCipher – Zetetic

SQLCipher Community Editionは自分でビルドしないといけませんが、俺達にはCocoaPodsがついてるんだぜ。

FMDB + SQLCipher 導入方法

CocoaPods

Podfileに以下を追記

pod 'FMDB/SQLCipher'

ターミナルでpod install

$pod install

Project設定

project_settings

Project > Build Settings > Other C Flagsに “-DSQLITE_HAS_CODEC” を追記

以上で導入完了です。

使い方

ほぼ通常のFMDBと同様ですが、毎回FMDatabaseをOpenした直後に
setKeyで暗号化のキーをセットしてあげてください。

FMDatabase* db = [FMDatabase databaseWithPath:@"path/to/dbfile"];
NSString* sql = @"INSERT INTO nums (num) VALUES (?)";
[db open];
[db setKey:@"dbfile_encrypt_key"]; // 暗号化のキーを設定
[db executeUpdate:sql, [NSString stringWithFormat:@"%ld", num]];
[db close];

サンプルコード

haranicle/DadamoreApp
のFmdbDaoを見てください。
ビルドする前にpod installしてください。

ハマりポイント

FmdbDaoの@propertyにFMDatabase*型のインスタンスを持たせて、
いろんなメソッド(INSERTするメソッドとかSELETするメソッドとか)で使いまわしていたら、
以下の様なエラーが出て、DBにアクセスできませんでした。

26 "file is encrypted or is not a database"

各メソッドで毎回FMDatabase#databaseWithPathして、setKeyをするようにしたら
正常にDBにアクセスできて、暗号化も動作するようになりました。

参考

FMDB with SQLCipher Tutorial | Guilmo

Pocket