【入門編】QueryDefのSQLを「暗号化」して保存する:ソースコード保護の最終防衛ライン – Access VBA解析バイブル

スポンサーリンク

Access VBAの「聖域」を守れ。QueryDefを暗号化してSQLロジックを隠蔽する最終防衛術

こんにちは。Access開発の世界へようこそ。

Accessを使っていると、ふと不安になる瞬間はありませんか?
「このクエリの中に書いた複雑なロジックや、企業秘密に直結する抽出条件、誰かに勝手に書き換えられたり、覗き見されたりしたらどうしよう……」と。

Accessのクエリは、誰でもデザインビューで開けてしまいますよね。しかし、プロフェッショナルは違います。「QueryDefそのものを暗号化して保存し、実行時にだけ復号する」という、いわば「魔法の封印」を施すのです。

今日は、あなたの書いた大切なSQLコードを、外部からの視線から守るための「最終防衛ライン」を構築する方法を伝授します。

—

1. なぜ「QueryDef」を暗号化する必要があるのか?

通常、Accessのクエリは「生のSQL」として保存されます。これでは、中身を知っている人なら誰でも、クエリをダブルクリックするだけでロジックを解析できてしまいます。

私たちが目指すのは、「保存時はただのゴミデータに見せかけ、実行する瞬間にだけ、メモリ上で本物のSQLとして組み立てる」という仕組みです。

守るべき3つのステップ

1. エンコード/暗号化: SQL文を不可読な文字列に変換してQueryDefに保存。
2. 実行時のデコード: 実行直前に元のSQLに戻す。
3. 動的パラメーター注入: 復号したSQLを`QueryDef`オブジェクトにセットして実行。

—

2. 実装の設計図:暗号化のコード例

ここでは、最もシンプルかつ効果的な「Base64に近い変換(XOR演算)」を用いた難読化の例を紹介します。実務ではAES等の強力な暗号化ライブラリを組み合わせることも可能ですが、まずはこのロジックで「覗き見」を完全に防ぎましょう。

手順:SQLを暗号化して保存するコード

‘ SQLを保存するためのモジュール
Public Sub SaveEncryptedQuery(queryName As String, sqlContent As String)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim encryptedSql As String

‘ SQLを暗号化(ここでは簡単のため文字コードをずらす簡易暗号化)
encryptedSql = SimpleEncrypt(sqlContent)

Set db = CurrentDb

‘ QueryDefが存在すれば削除し、新しく作成する
On Error Resume Next
db.QueryDefs.Delete queryName
On Error GoTo 0

‘ 暗号化された文字列をダミーとして保存
Set qdf = db.CreateQueryDef(queryName, encryptedSql)

Debug.Print “クエリを暗号化して保存しました。”
End Sub

‘ 簡易暗号化関数(ロジックを隠すための鍵)
Private Function SimpleEncrypt(text As String) As String
Dim i As Long, result As String
For i = 1 To Len(text)
‘ 文字コードに123を足すという単純なシフト
result = result & Chr(Asc(Mid(text, i, 1)) Xor 123)
Next i
SimpleEncrypt = result
End Function

—

3. 実行の魔法:メモリ上で復号して動かす

保存されたクエリは、見た目には意味不明な文字列です。これを実行する際は、QueryDefから文字列を読み取り、メモリ上で復号してから`Execute`または`OpenRecordset`を実行します。

Public Sub ExecuteEncryptedQuery(queryName As String)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rawSql As String

Set db = CurrentDb
Set qdf = db.QueryDefs(queryName)

‘ 保存されている暗号化SQLを復号
rawSql = SimpleEncrypt(qdf.SQL)

‘ 復号したSQLで一時的にクエリを上書き、あるいは即時実行
‘ ここではRecordsetを開いて結果を取得する例
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset(rawSql)

‘ … ここでレコードセットを処理 …

rs.Close
End Sub

—

4. 陥りやすいエラーと回避術

初心者の方がよくハマるポイントを、先輩として先回りして伝授します。

  • 「クエリが見つかりません」エラー:

QueryDefを作成する際、`db.QueryDefs.Delete`を忘れると重複エラーになります。必ず存在確認を行うか、エラーを無視するトラップを入れましょう。

  • SQLの構文エラー:

復号した文字列が微妙にずれるとSQLとして機能しません。文字コードの扱い(特に日本語が含まれる場合)には細心の注意を払い、`StrConv`関数などでUnicode変換を考慮してください。

  • 「開いたまま編集」の罠:

Accessの画面上でクエリを開いていると、VBAからの保存が失敗することがあります。開発中は「クエリウィンドウを全て閉じる」処理を自動化しておくとスムーズです。

—

最後に:完璧な防御は「運用」にある

この手法は、非常に強力な防壁になります。しかし、最も重要なのは、「VBAコード自体にパスワードをかける」ことです。

VBAのプロジェクトパスワードを保護しなければ、この暗号化ロジックそのものが見られてしまいます。

1. VBAエディタを開く
2. [ツール] > [VBAProjectのプロパティ] > [保護]
3. パスワードを設定する

これで、あなたのAccessアプリケーションは「中身が見えないブラックボックス」として、堅牢に守られます。

Access VBAは、あなたのアイデアを形にする強力な武器です。その武器をどう守るか。この意識を持てたあなたは、もう初心者ではありません。一歩上のエンジニアへの道を、自信を持って進んでください。

何か詰まったら、いつでも戻ってきてくださいね。応援しています。

タイトルとURLをコピーしました