slumbers

思いついたことをつらつらと

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 を展開したのがこちら。

f:id:slumbers99:20131222002213p:plain

assets/ やら libs/ やらをつかいたいプロジェクトにそのままポーンと。

f:id:slumbers99:20131222002407p:plain

こんな感じ。

いつものように 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) でいちいちキー渡すのがめんどいのでオーバーロード。

こんな感じでやってみました。


gist8071147

結果

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>

見れないっぽい。

Eclipse ADT のプロジェクトはこちら

slumbers99/SampleSqlCipher · GitHub