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

スポンサーリンク

Access VBAの「聖域」を守れ:QueryDefを暗号化してSQLロジックを隠蔽する極意

Access開発の現場で、長年「最後の課題」として議論されるのが「SQLロジックの保護」だ。
`.accdb`ファイルは、どれほど複雑なクエリを構築しても、ナビゲーションウィンドウから「デザインビュー」を開けば、誰でもそのアルゴリズムを盗み見ることができる。知的財産が詰まった複雑なSQLが白日の下に晒される現状を、君は放置していないか?

本稿では、`QueryDef`オブジェクトのSQLプロパティを暗号化し、実行時にメモリ上で復号して動的に走らせる「最終防衛ライン」の構築手法を伝授する。

—

なぜ「そのまま」保存してはいけないのか

Accessにおいて、クエリは単なるデータ取得の手段ではない。業務ロジックそのものだ。

  • 競合・盗用リスク: 苦労して作成した複雑な結合や計算式が、競合他社や退職者に流出する。
  • 改ざんリスク: 誰かが不用意にクエリを編集し、業務基盤が崩壊する。

これらを防ぐための「難読化」は、単なる気休めではない。プロフェッショナルとして、守るべきロジックを「バイナリ・ゴミ」の形に変えて保存する責任がある。

—

実装戦略:メモリ上での動的クエリ実行

基本的な戦略は以下の通りだ。
1. 暗号化: SQL文をBase64や簡易XOR等でエンコードして`QueryDef`に保存する。
2. 復号: 実行時に`QueryDef.SQL`を読み取り、メモリ上で復号する。
3. 実行: 復号したSQLを`CurrentDb.CreateQueryDef`で一時オブジェクトとして走らせるか、`DoCmd.RunSQL`(アクションクエリの場合)で直接実行する。

実践:SQL暗号化・復号モジュール

以下に、実務でそのまま使える堅牢なクラス設計の断片を示す。

‘ 必要な参照設定: Microsoft DAO 3.6 Object Library 以上
‘ シンプルなXOR暗号化クラス (簡易的な難読化用)
Option Compare Database
Option Explicit

Public Function ObfuscateSQL(ByVal sql As String) As String
‘ 簡易的なXOR変換 + Base64変換を想定したモック
‘ ※本番ではより強固なAESライブラリ等を使用すること
Dim i As Long
Dim result As String
For i = 1 To Len(sql)
result = result & Chr(Asc(Mid(sql, i, 1)) Xor 123)
Next i
ObfuscateSQL = EncodeBase64(result)
End Function

Public Function ExecuteEncryptedQuery(ByVal 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 = DecodeBase64(qdf.SQL)
rawSQL = ObfuscateSQL(rawSQL) ‘ 復号処理

‘ 実行用の一時クエリとして作成し実行
Dim tmpQdf As DAO.QueryDef
Set tmpQdf = db.CreateQueryDef(“”, rawSQL)
tmpQdf.Execute dbFailOnError

tmpQdf.Close
Set tmpQdf = Nothing
End Function

—

プロダクション環境での「3つの鉄則」

コードをコピペして終わりにしてはならない。伝説的なエンジニアを目指すなら、以下の設計思想を心に刻め。

1. 「一時クエリ」のライフサイクルを管理せよ

`CreateQueryDef`で名前を空文字`””`にして作成すると、そのクエリはメモリ上にのみ存在し、プロシージャ終了とともに消滅する。永続的なクエリを放置するのは、脆弱性の温床だ。必ず後始末を徹底すること。

2. パラメータクエリとのハイブリッド構成

複雑なSQLを丸ごと暗号化すると、可読性が著しく低下しメンテナンスが地獄と化す。

  • 固定SQL部: 暗号化して`QueryDef`に隠蔽。
  • 可変条件(WHERE句): `Parameters`コレクションを使い、動的にバインドする。

この分離こそが、保守性と保護性能を両立させる唯一の解だ。

3. 「鍵」をコード内に埋め込むな

暗号化のためのキーをVBAの定数としてハードコードしてはならない。それは「金庫の鍵を金庫の前に置く」のと同じだ。キーは外部の設定テーブルや、実行時にのみ生成される環境変数から読み込むように設計せよ。

—

結び:防御は「開発の美学」である

Accessが持つ「誰でも編集できる」という利便性は、時として「誰でも壊せる」という弱点になる。
我々エンジニアがやるべきことは、ツールを使いやすくするだけではない。「意図しない変更」からシステムを隔離し、ロジックという名の資産を守り抜くことだ。

この手法は、コードの難読化という名の「防壁」に過ぎない。しかし、その防壁を築こうとする姿勢こそが、君のシステムを真のプロダクションレベルへと昇華させる。

さあ、今すぐ既存のクエリを整理し、暗号化という名の聖域を構築せよ。それができるのは、この技術を理解した君だけなのだから。

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