スマートフォン勉強会@関東 #11 LT 5分で語る SQLite暗号化
-
Upload
taro-matsuzawa -
Category
Technology
-
view
6.046 -
download
0
Transcript of スマートフォン勉強会@関東 #11 LT 5分で語る SQLite暗号化
5分で語るSQLite暗号化
Taro Matsuzawa aka. btm (@smellman)sumaben@kanto #11 Lightning Talk
SQLite
• iPhoneとかで使えるSQLデータベース
• ファイルベースで扱いが楽
• Firefoxのバックエンドにも使われてる
暗号化?
• JBされてもデータが盗まれないように
• 版権物のデータをBlobデータにつっこんでおいて盗まれないように。
sqlcipher
• SQLiteの暗号化の仕組みの実装
• SQLite自体に暗号化するための枠組みはあって、拡張として実装すると使えるようになる
• iPhoneで動くのでやってみよう
やり方 1
$ sudo mkdir -p /opt/smartphone/lib$ sudo chown -R btm:staff /opt/smartphone$ cd /opt/smartphone/lib/$ git clone git://github.com/sjlombardo/sqlcipher.git$ curl -O ftp://ftp.infoscience.co.jp/pub/Crypto/SSL/openssl/source/openssl-1.0.0a.tar.gz$ git clone git://github.com/sjlombardo/openssl-xcode.git$ tar zxf openssl-1.0.0a.tar.gz $ cp -fr openssl-xcode/openssl.xcodeproj openssl-1.0.0a/$ mv openssl-1.0.0a openssl
やり方 2
• XCodeのメニューから環境変数を開く
• ソースツリー項目で、以下を設定
• SQLCIPHER_SRC は SQLCipherの場所を選択
• SQLCIPHER_SRC:/opt/smartphone/lib/sqlcipher
• OPENSSL_SRC は OpenSSLの場所を選択
• OPENSSL_SRC:/opt/smartphone/lib/openssl
やり方 3
• XCodeのメニューからプロジェクト->プロジェクトに追加を選択
• OpenSSLのディレクトリのopenssl.xcodeprojを選択
• デスティネーショングループのフォルダに項目をコピーするは選択しないで追加をする。
• 同様にSQLCipherのディレクトリのsqlcipher.xcodeprojもプロジェクトに追加する
やり方 4
• SQLCipherとOpenSSLのロケーションが動くように変更する。
• sqlcipher.xcodeprojを選択して、右クリック->情報を見るを選択
• パスタイプで SQLCIPHER_SRC を基準 を選択する。
• openssl.xcodeprojを選択して、右クリック->情報を見るを選択
• パスタイプで OPENSSL_SRC を基準 を選択する。
やり方 5• XCodeのメニューからプロジェクト->アクティブターゲット"SQLCipherTest"を編集を選択
• 一般タブで、直接依存関係の項目で、+ボタンを押す。
• OpenSSLのcryptoと、SQLCipherのsqlcipherを選択
• ビルドタブに移動して、構成で「すべての構成」を選択
• 「検索パス」項目にある「ヘッダ検索パス」を編集
• $(SQLCIPHER_SRC) と $(OPENSSL_SRC) を追加し、それぞれ再帰的にチェックをいれる。
やり方 6
• sqlcipher.xcodeprojにあるlibsqlcipher.aをターゲットの「バイナリをライブラリにリンク」へコピー
• openssl.xcodeprojにあるlibcrypto.aをターゲットの「バイナリをライブラリにリンク」へコピー
• ビルドの設定でプリプロセッサマクロに SQLITE_HAS_CODEC=1 を追加
使い方• SQL文として以下のコードを流すと暗号化される。
• PRAGMA key = 'default_key';
• コマンドライン版sqlcipherもつくるとよい
• 鍵の内容をデバイスで一意になるようにしておけばよい。
• FMDatabaseなどのフレームワークは標準で対応
• FMDatabase setKey
サンプル! NSString* key = @"TaroMatsuzawaIsDead";! NSString* newKey = [key stringByAppendingString: [[UIDevice currentDevice] uniqueIdentifier]];
! if (![rootViewController.encdb setKey:key])! ! NSLog(@"> Could not set key.");
URLなど• sqlcipher
• http://sqlcipher.net/
• sqlcipher document
• http://sqlcipher.net/documentation
• openssl-xcode
• https://github.com/sjlombardo/openssl-xcode
• FMDatabase
• https://github.com/ccgus/fmdb
おまけ• コマンドラインはこんな感じで作る
$ sudo port install openssl$ mkdir -p ~/develop/sqlcipher$ cd ~/develop/sqlcipher$ git clone git://github.com/sjlombardo/sqlcipher.git$ cd sqlcipher$ ./configure CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="/opt/local/lib/libcrypto.a"$ make
$ ~/develop/sqlcipher/sqlcipher/sqlite3 sqlite3.dbSQLite version 3.7.2Enter ".help" for instructionsEnter SQL statements terminated with a ";"sqlite> .read /Users/btm/develop/(秘密)/schema.sql
sqlite> PRAGMA key = 'default_key';