Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

SQLite の暗号化

10,108 views

Published on

Encryption of SQLite in Cocos2d-x

Published in: Mobile
  • Hey guys! Who wants to chat with me? More photos with me here 👉 http://www.bit.ly/katekoxx
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

SQLite の暗号化

  1. 1. SQLite の暗号化 Akihiro Matsuura @ Syuhari, Inc.
  2. 2. About me • 松浦 晃洋 • 株式会社シュハリ 代表取締役 • Cocos2d-x ゲーム開発 • 書籍、雑誌などの執筆 • Cocos2d-x エヴァンジェリスト
  3. 3. 開発のプロが教える Cocos2d-x逆引きガイドブック
  4. 4. Cocos2d-x Game Development Essentials Building Android Games 
 with Cocos2d-x 海外での出版に協力
  5. 5. SQLite を暗号化する
  6. 6. 候補は2つ SQLCipher iOS でビルド OK
 Android でビルド NG SQLiteManager が対応している wxSqlite3 C++ ライブラリでビルドも簡単
  7. 7. wxSqlite3 を Cocos2d-x へ組み込む
  8. 8. wxSqlite3 をダウンロード • ドキュメント • http://wxcode.sourceforge.net/docs/wxsqlite3/
 • ダウンロード • http://sourceforge.net/projects/wxcode/files/Components/ wxSQLite3/
 • 検証は Cocos2d-x ver3.6、wxSqlite3 ver3.1.1 で行いました
 Cocos2d-x ver3.2 でも動作確認しました
  9. 9. wxSqlite を Cocos2d-x へコピー zip内の sqlite3/secure/src を 
 cocos2d/external/wxsqlite/src へコピー
  10. 10. iOS 用の設定
  11. 11. Xcode にソースを追加 wxsqlite/src 内の 
 sqlite3.h 
 sqlite3secure.c  
  12. 12. フラグを追加 Other C Flags に -DSQLITE_HAS_CODEC を追加する
  13. 13. #ifdef SQLITE_HAS_CODEC /* ** Specify the key for an encrypted database. This routine should be ** called right after sqlite3_open(). ** ** The code to implement this API is not available in the public release ** of SQLite. */ SQLITE_API int sqlite3_key( sqlite3 *db, /* Database to be rekeyed */ const void *pKey, int nKey /* The key */ ); SQLITE_API int sqlite3_key_v2( sqlite3 *db, /* Database to be rekeyed */ const char *zDbName, /* Name of the database */ const void *pKey, int nKey /* The key */ ); SQLITE_HAS_CODEC を定義することにより、
 sqlite3_key や sqlite3_rkey が使えるようになる sqlite3.h
  14. 14. Android 用の設定
  15. 15. cocos2d/external/wxsqlite/Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := wxsqlite3_static LOCAL_MODULE_FILENAME := libwxsqlite3 LOCAL_CFLAGS += -DSQLITE_HAS_CODEC LOCAL_SRC_FILES := src/sqlite3secure.c LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src LOCAL_C_INCLUDES := $(LOCAL_PATH)/src include $(BUILD_STATIC_LIBRARY) (新規作成)
  16. 16. • 赤文字は削除 • 青文字は修正 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := cocos_localstorage_static LOCAL_MODULE_FILENAME := liblocalstorage LOCAL_SRC_FILES := LocalStorage.cpp LocalStorageAndroid.cpp LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/.. LOCAL_C_INCLUDES := $(LOCAL_PATH)/../.. LOCAL_CFLAGS += -Wno-psabi LOCAL_CFLAGS += -DSQLITE_HAS_CODEC LOCAL_EXPORT_CFLAGS += -Wno-psabi LOCAL_WHOLE_STATIC_LIBRARIES := wxsqlite3_static LOCAL_STATIC_LIBRARIES := cocos2dx_internal_static include $(BUILD_STATIC_LIBRARY) $(call import-module,.) $(call import-module,external/wxsqlite3) cocos2d/cocos/storage/local-storage/Android.mk
  17. 17. cocos2d/cocos/storage/local-storage/ LocalStorage.cpp #include "LocalStorage.h" #include "platform/CCPlatformMacros.h" //#if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) #include <stdio.h> #include <stdlib.h> L 33 と L157 をコメントアウトする
  18. 18. proj.android/jni/Android.mk LOCAL_SRC_FILES := hellocpp/main.cpp ../../Classes/AppDelegate.cpp ../../Classes/HelloWorldScene.cpp ../../cocos2d/external/wxsqlite/src/sqlite3secure.c LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../cocos2d/external/wxsqlite/src/ LOCAL_CFLAGS += -DSQLITE_HAS_CODEC
  19. 19. 実際に使ってみる
  20. 20. DBへのアクセス方法 sqlite3_open(path.c_str(), &database); DB オープン後にパスワードを指定するだけ sqlite3_key(database, password, (int)strlen(password));
  21. 21. 注意点 • 初回起動時に空の DB を作成して暗号化すること • SQLite のファイルをコピーしてきて暗号化するこ とはできない
  22. 22. • SQL の更新が面倒 • 暗号化されるとデバッグしにくいので暗号化は仕上げの段階で行う方 がいい • ただ暗号化後のパフォーマンスチェックは大事 • 普段は暗号化せずにリリースビルドとチェック時のみに暗号化する • パフォーマンスは若干低下 • 頻繁なアクセスは出来るだけしないようにする 実際に使ってみて
  23. 23. • SQL の更新が面倒 • 暗号化する、しないを簡単にかつ確実に行いたい 問題点
  24. 24. 結構変更あるし、DB にデータ挿入してるし SQL 作るのが面倒 問題点1:SQL の更新が面倒 SQLite ファイルからビルド時に自動的に SQL をダンプするスクリプトを作成
  25. 25. SQLite をダンプするスクリプト #!/bin/sh commandline() { sleep 1; echo ".output ../Resources/data/data.sql" sleep 1; echo ".dump" sleep 1; echo ".exit" } commandline | sqlite3 ../Resources/data/data.sqlite
  26. 26. Xcode の Post-action に設定
  27. 27. SQL を読み込み暗号化した
 データベースを作成 sqlite3 *database = NULL; sqlite3_open(dbpath.c_str(), &database); sqlite3_key(database, DB_PASSPHRASE, (int)strlen(DB_PASSPHRASE)); auto util = FileUtils::getInstance(); std::string path = util->fullPathForFilename(“path/to/sql”); std::string sql = util->getStringFromFile(path); sqlite3_exec(database, (char*)sql, 0, 0, NULL); sqlite3_close(database);
  28. 28. 問題点2:暗号化する設定を変える #if !defined(COCOS2D_DEBUG) || COCOS2D_DEBUG == 0 || SQLITE_ENCRYPT==1 sqlite3_key(database, DB_PASSPHRASE, (int)strlen(DB_PASSPHRASE)); #endif COCOS2D_DEBUG >1 または SQLITE_ENCRYPT==1 のときのみ暗号化 リリースビルドでは絶対に暗号化される
  29. 29. Demo https://github.com/syuhari/wxSqlite3
  30. 30. Cocos2d-x で 開発したいエンジニア 大募集中! • @syuhari • facebook.com/syuhari

×