質問: Cordovaを使用してJavaScript、HTML、CSSでスマホアプリを作成しています。 その際、スマホ端末内でデータベース(WebSQL)を利用しています。 したがって、JavaScriptファイル内にSQL文を記述するのですが、 それらのファイルを、Uglifyでミニファイ(難読化)しても容易にデータベース構造が解読される状態になります。 例えば、次のようなコードの場合、()内が文字列のため、難読化されないと思われます。 ``` tx.executeSql('CREATE TABLE ... '); ``` データベースを暗号化して使用する場合、データベースの中身は分からないにしても、 データベース構造が容易に分かってしまうのは危険性が高いと考えますが、 JavaScriptを使用する場合、仕方がないのでしょうか。 それとも、データベースの構造を難読化する解決策はあるのでしょうか?
回答: いろいろ質問への回答では無いことも書きますが、お許しください。 とりあえず、一番簡単なのはWebSQLをやめてLocalStorageを使いkeyを分かりにくい名前にすることです。まずローカルでSQLを使わないと管理できないほどのものを扱っているのでしょうか。あとWebSQLはW3Cの標準からは抜けたので今後どれだけメンテされるか怪しいです。 また > > データベースを暗号化して使用する場合、データベースの中身は分からない > > > というのは正しくありません。ローカルでデータベースを読み書きしている以上鍵もローカルにあるので少し頑張ればデータは読めてしまいます。 なのでJavaScript内のSQLクエリを難読化することに意味があるかというと、自分は努力に見合う効果は無いと思います。コードのuglifyもぶっちゃけソースを小さくすること以外そこまで効果は無いです。 それでもSQLクエリを難読化したい場合、JavaScriptに記載する文字列を事前に暗号化しておき、それを分かりにくい関数を用いて復号化するという感じになります。実際にやるならば、PerlなどでJavaScriptのソースからクエリを抜き出し暗号化したものへ置き換えるスクリプトを作り、リリース前にすべてのソースをそのスクリプトを通すという流れになると思います。 ``` function decryptSql(sqlQuery) { //復号化する関数を用意 } //スクリプトで以下のようなコードを自動で置き換える //tx.executeSql('CREATE TABLE ... '); tx.executeSql(decryptSql('暗号化された文字列')); ```