【実務・中級編】【上級】AcadDocument.Database.Dictionariesへの「暗号化ライセンスキー」埋め込み:自作VBAツールの不正利用を防止する図面単位の認証機構 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの領域を支配せよ:図面内への「ライセンスキー」埋め込みによる知的財産防衛術

AutoCAD VBAで業務効率化ツールを開発する諸君。君たちが丹精込めて作り上げたツールは、ただのコードの塊ではない。それは業務プロセスを最適化し、企業の利益を直接生み出す「知的財産」だ。

しかし、無防備なツールは容易にコピーされ、社内の非正規なルートで拡散される。今回は、配布したツールが特定の図面(あるいは特定のプロジェクト)でしか動作しないよう、`AcadDocument.Database.Dictionaries` に秘匿情報を刻み込むという、極めて実戦的なセキュリティ実装を伝授する。

これは単なる「小細工」ではない。AutoCADのデータベース構造を深く理解し、非グラフィカルデータ領域を制御する、アーキテクトとしての必須教養だ。

なぜ「Dictionaries」なのか?

AutoCADの図面データ構造において、`Dictionaries`は拡張レコード(XRecord)を格納する巨大なコンテナだ。ユーザーからは見えず、オブジェクトプロパティウィンドウにも現れない。

ここにライセンスキーや有効期限を埋め込む理由は明白だ。
1. 永続性: 図面を保存すれば、そのデータは図面に癒着する。
2. 非視覚性: 一般的なユーザーは、この領域を操作する方法を知らない。
3. 整合性: `AcadDocument`に直結しているため、図面を開いた瞬間に認証チェックが可能。

【プロダクションコード】堅牢な認証メカニズムの実装

以下は、自作ツールに組み込むべき「認証キー書き込み・読み込み」のコアロジックだ。クラスモジュールとして設計し、再利用性を高めるのが定石である。

‘ @class SecurityManager
Option Explicit

Private Const DICT_NAME As String = “MY_TOOL_LICENSE”
Private Const XREC_NAME As String = “LICENSE_DATA”

‘ 図面にライセンスキーを埋め込む
Public Sub EmbedLicenseKey(ByVal key As String)
Dim dictObj As AcadDictionary
Dim xRec As AcadXRecord
Dim dataTypes(0) As Integer
Dim dataValues(0) As Variant

‘ 辞書オブジェクトを取得または作成
Set dictObj = ThisDrawing.Database.Dictionaries.Add(DICT_NAME)

‘ 拡張レコードを作成
Set xRec = dictObj.AddXRecord(XREC_NAME)

‘ データを設定 (DXFコード 1 は文字列)
dataTypes(0) = 1
dataValues(0) = key

xRec.SetXRecordData dataTypes, dataValues
End Sub

‘ ライセンスキーを検証する
Public Function IsLicenseValid(ByVal expectedKey As String) As Boolean
On Error GoTo ErrHandler
Dim dictObj As AcadDictionary
Dim xRec As AcadXRecord
Dim dataTypes As Variant
Dim dataValues As Variant

Set dictObj = ThisDrawing.Database.Dictionaries.Item(DICT_NAME)
Set xRec = dictObj.GetObject(XREC_NAME)

xRec.GetXRecordData dataTypes, dataValues

‘ 格納されているキーと照合
If dataValues(0) = expectedKey Then
IsLicenseValid = True
Else
IsLicenseValid = False
End If
Exit Function

ErrHandler:
IsLicenseValid = False ‘ キーが存在しない、または読み取り不可の場合は無効
End Function

開発者が心得ておくべき「3つの鉄則」

コードを動かすだけで満足してはならない。プロのエンジニアとして、以下の制約を認識せよ。

1. データの「難読化」は必須

上記のコードはあくまで概念実証用だ。`dataValues(0)`に平文でキーを入れるのは、金庫に鍵を貼り付けておくようなもの。最低限、簡単なXOR暗号やBase64変換を施した文字列を格納するようにせよ。

2. 「DXFコード」の魔法

`SetXRecordData`で使用する`dataTypes`は、AutoCADのDXF仕様に準拠している。文字列だけでなく、整数(70番台)や実数(40番台)も混在可能だ。有効期限をUNIXタイムスタンプとして`Double`型で埋め込み、現在時刻と比較するロジックを加えれば、時間制限付きライセンスも容易に実装できる。

3. データベースの汚染を防ぐ

`Dictionaries`はシステムにとって重要な領域だ。安易にオブジェクトを量産すると、図面の肥大化や破損を招く。必ず `On Error` を適切にハンドリングし、存在確認を行ってから作成する設計(防御的プログラミング)を徹底すること。

最後に:自動化の真髄

AutoCAD VBAは、単に「手間を省くための道具」ではない。
君たちが書いたロジックが、図面そのものに知能を与え、ツールと図面が対話することで初めて強固なワークフローが完成する。

今回紹介した「埋め込み認証」は、ツールを守るための盾であり、同時に君たちのコードがプロのエンジニアリング品質であることを証明する署名でもある。

次のステップとして、この認証チェックを `AcadDocument_Activate` イベントに仕込み、図面を開くたびに検証が走るように実装してみるといい。より高次元なツール開発の世界へ、ようこそ。

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