Android で SQLite の暗号復号ライブラリ SQLCipher を使ってみた。
SQLCipher とは
SQLCipher is an open source extension to SQLite that provides transparent 256-bit AES encryption of database files.
透過的に SQLite を 256ビット AES で暗号化してくれるオープンソース・ソフトウェア だそうです。透過的にってのがいいですね。対応するプラットフォームも Android, iOS と両方揃ってて昨今のスマフォアプリに欠かせない SQLite のデータ保護に役立つと思います。
Android の場合、Proguard でアプリのコードを難読化したりしますが、さすがに Proguard でも SQLite の中身までは触りません。SQLite の保存先は /data/data/[package.name]/databases/[db.name] 。 該当のアプリケーション以外からはパーミッション的に保護されてますが、アクセスする方法はあるので、何かしらの個人情報が入っていたら・・・・・?まあそんな感じです。
何はともあれライブラリを入手しましょう。
Downloads - SQLCipher - Open Source Full Database Encryption for SQLite から SQLCipher For Android のリンクをクリック zip をダウンロードします。ちなみに github にリポジトリがあるので自分でビルドすることもできるようです。
プロジェクトに入れる
ダウンロードした zip を展開したのがこちら。
assets/ やら libs/ やらをつかいたいプロジェクトにそのままポーンと。
こんな感じ。
いつものように SQLiteOpenHelper を作る
ただし継承先は
net.sqlcipher.database.SQLiteOpenHelper。そうすると SQLiteDatabase も net.sqlcipher.database.SQLiteDatabase が使われるようになります。
SQLCipher のお約束
- SQLiteDatabase.loadLibs(context); を get(Read|Writ)ableDatabase() の前に呼ぶ。
- get(Read|Writ)ableDatabase(String) は 暗号化キーを渡す。
実際に作ってみた。
今回作るにあたって
- SQLiteDatabase.loadLibs(Context) は SQLiteOpenHelper のなかに。
- 暗号化キーはUUID(SharedPreferencesに保存しちゃまずい?キーはどこに持つのがいいんだろうか?)
- et(Read|Writ)ableDatabase(String) でいちいちキー渡すのがめんどいのでオーバーロード。
こんな感じでやってみました。
結果
2:17:31 peko@MBA.local ~ adb -s 192.168.56.102:5555 shell shell@android:/ $ su - Test prop no androVM.su.bypass prop -> su access rights managed by the SuperUser app /com.example.samplesqlcipher/databases/ < app.db < SQLite version 3.7.11 2012-03-20 11:35:50 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> sqlite> sqlite> sqlite> .tables Error: file is encrypted or is not a database sqlite>
見れないっぽい。