Fioの素敵な日々

日々の出来事や何やらをつれづれに

VBScriptでSQLiteを暗号化する

軽量で軽快なデータベースSQLite

SQLiteは今やネット上のサーバからローカルなアプリの設定ファイルまで、様々な場面で使われることが多くなっています。

データベースがファイルベースなため、持ち運びやバックアップが楽な反面、暗号化ができないため、格納するデータにはセキュリティ面で大変気を使わなくてはなりませんでした。

SQLiteが使いやすく、持ち運びに便利なだけ、暗号化のニーズは結構あったように思います。
無料で使えて、軽くて速くて使いやすいとなれば、公開したくないデータもSQLiteで扱いたいと思うのは当然かと思います。

SQLiteの暗号化は.NETを使うと無料でできる

有償で暗号化できる仕組みは知っていましたが、PupSQLiteを使ってみて、実はずいぶん前から.NETを使って暗号化する仕組みがあったことを知りました。
System.Data.SQLiteという便利なものがあったんですね。
これを使えばSQLiteの暗号化ができるではありませんか。
PupSQLiteが対応しているSQLiteの暗号化はこれを使っています。

注意しないといけないのは、System.Data.SQLiteを検索すると出てくるSystem.Data.SQLiteというページは、すでに更新が止まっており、ここから最新版は入手できないということです。
.NET4などに対応したSystem.Data.SQLiteの最新版は、System.Data.SQLite Download Pageの方からダウンロードできます。

System.Data.SQLiteによる暗号化をVBScriptから使えるようにする

VBScriptから使うには、SQLite ODBC Driverの対応具合を調べて見るのがいいかと。
SQLite ODBC Driverのサイトを見てみると、暗号化対応バージョンが密かにありました。(実験段階だそうですが)sqliteodbc_dl.exeというファイルです。

これをインストールして、「needs System.Data.SQLite.dll or sqlite3.dll in the Windows system folder」にしたがって、(実はPupSQLiteのフォルダにあった)System.Data.SQLite.dllをWindowsフォルダの中のSystem32フォルダへ(64bitバージョンはそれなりに対応してください)。
これだけでVBScript(だけでなくVBAやRubyなどからもももちろん)からODBCを通してSQLiteの暗号化に対応することができました。

SQLiteの暗号化のテストスクリプト

VBScriptと同じフォルダに「暗号化.db」と言う名前で、パスワードが123の暗号化されたSQLiteデータベースを作成してデータを入れてみます。

FileName = Replace(WScript.ScriptFullName, WScript.ScriptName, "暗号化.db")

Set CN = CreateObject("ADODB.Connection")
CN.Open "DRIVER=SQLite3 ODBC Driver;Database=" & FileName & ";password=123;"

CN.Execute "CREATE TABLE IF NOT EXISTS テーブル1 (ID, 名前, ポイント);"
CN.Execute "INSERT INTO テーブル1 VALUES(1, 'ABC', 55);"
CN.Execute "INSERT INTO テーブル1 VALUES(2, 'あいう', 88);"
Set RS = CN.Execute("SELECT * FROM テーブル1;")
WScript.Echo RS.GetString
RS.Close: Set RS = Nothing

CN.Close: Set CN = Nothing

これでできたデータベースをPupSQLiteで同じパスワードで開くことができます。
ちなみに上の例は、データベース名、テーブル名、フィールド名に日本語を使ってますが、よい子はまねしちゃいけませんね。(ただPupSQLiteではきちんと表示できます)
試しにパスワードを日本語にしてみたら、なんと使えました。ただPupSQLiteで開くことはできませんでした。。

まとめ

SQLite ODBC Driverを使って、以外と簡単に暗号化SQLiteを扱うことができました。
ODBCに対応しているアプリケーションであれば、共通のデータベースを使うことができるので、SQLiteの用途をさらに広げることができそうです。