30
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

cocos2d-x ローカルデータの暗号化、SQLCipherを爆速化する方法

Last updated at Posted at 2015-07-19

SQLCipherについて

SQLiteを暗号化してくれるツールです。
cocos2d-xなんかでデバイスにデータを保存する場合、管理を楽にする為にSQLiteを使い、チート対策の為にSQLCipherで暗号化している方もいらっしゃるかと思います。

SQLCipherはビルド済みライブラリを使用する場合は有償ですが、自分でビルドしてライセンスを明記すれば無償で商用利用可能です。
導入方法は多くの方が執筆しており、特に困ることは無いと思うので割愛します。

ただ、SQLCipherを利用すると、利用していない時と比べてアクセス速度が格段に落ちるので、何か出来ないかとドキュメントを読んでみました。

keyの形式を変えて爆速に

結論から言うと、自由なパスフレーズは渡せなくなるものの、sqlite3_keyに渡す文字列を変更すると爆速になりました。

-    string key = 'passphrase';
     sqlite3_key(db, key.c_str(), static_cast<int>(strlen(key.c_str())));

+    string key = "x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'";
     sqlite3_key(db, key.c_str(), static_cast<int>(strlen(key.c_str())));
(keyは独自のものに変えてください)

keyを任意のパスワードでは無く、64文字の16進数で与えます。公式ドキュメントによると、文字数はきっちり64文字である必要がある様です。
https://www.zetetic.net/sqlcipher/sqlcipher-api/#key

Example 2: Raw Key Data (Without Key Derivation)
Alternatively, it is possible to specify an exact byte sequence using a blob literal. With this method, it is the calling application's responsibility to ensure that the data provided is a 64 character hex string, which will be converted directly to 32 bytes (256 bits) of key data.

アプリを触って感じる範囲では、通常のSQLiteを使用している場合と動作速度はほぼ変わりませんでした。

セキュリティ面と動作について

そもそもSQLCipherが遅い理由は、パスフレーズにPBKDF2関数を繰り返し(デフォルトだと64,000回)適用することでセキュリティ強化している為です。
ブルートフォース攻撃と辞書攻撃を防ぐ為ですが、パスフレーズにこだわりが無く、カジュアルに暗号化する場合はRaw Keyを使用する方法で良いと思います。

上記の様にRaw Keyを使う以外の方法として、kdf_iterの数値を変更することでPBKDF2関数の適用回数を減らせば、
任意のパスフレーズを使いながら大幅に速度を変えることが可能かも知れません(試してません)。
ただし、当然セキュリティ面は弱くなると思います。
https://www.zetetic.net/sqlcipher/sqlcipher-api/#kdf_iter

As previously noted, SQLCipher uses PBKDF2 key derivation to strengthen the key and make it resistent to brute force and dictionary attacks. The default configuration uses 64,000 PBKDF2 iterations (effectively 256,000 SHA1 operations). PRAGMA kdf_iter can be used to increase or decrease the number of iterations used.

##免責的なもの
私自身はセキュリティのプロでも何でもないので、この方法の結果損失を生じても保証し兼ねます。申し訳ありません。
公式ドキュメントを参照し、自己責任で実装していただければと思います。
一応頑張って調べたので大丈夫だとは思います。

30
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?