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

スポンサーリンク

こんにちは。AutoCADの自動化という深淵な世界へようこそ。

「マクロの記録」から一歩踏み出し、AutoCADの内部構造を掌握しようとしているあなたへ。今日は、単なる自動化ツールを作るのではなく、「図面そのものを守るためのセキュリティ実装」という、少しプロフェッショナルな領域に案内します。

私たちが扱うAutoCADの図面ファイル(DWG)は、単なる絵ではありません。膨大なデータが階層構造で管理された「データベース」です。今日はその深部、`Dictionaries`(辞書)にアクセスし、自作ツールの利用権限を制御する「暗号化ライセンスキー」を埋め込む手法を伝授します。

1. なぜ「Dictionary」なのか?

AutoCADの図面には、図形(線や円)とは別に、設定値や拡張データを保持するための場所が存在します。その一つが`NamedObjectsDictionary`です。

なぜここにキーを埋め込むのか? それは、「図面ファイルがコピーされても、その認証情報が一生ついて回るから」です。外部ファイルにライセンスを保存しても、ファイルは分離されます。しかし、図面の中にデータを焼き付けてしまえば、その図面はあなたのツールでしか扱えない「専用資産」に生まれ変わります。

2. 認証機構のアーキテクチャ

まずは概念を整理しましょう。

1. 書き込み: `AcadDocument.Dictionaries` に新しい辞書を作成し、そこに「暗号化されたライセンスキー」を格納。
2. 読み込み: ツール起動時に辞書を検索し、キーが存在するか、また有効期限内かをチェック。
3. 判定: キーが不正、または期限切れなら処理を強制終了。

3. 実装:ライセンス埋め込みと検証コード

以下は、このロジックを実装するためのサンプルコードです。まずはコピーして、標準モジュールに貼り付けてみてください。

Option Explicit

‘ 認証用の辞書名とキー名
Const DICT_NAME As String = “MY_SECURITY_DICT”
Const KEY_NAME As String = “LICENSE_KEY”

‘ — ライセンスを書き込む関数 —
Public Sub SaveLicenseKey(keyData As String)
Dim dicts As AcadDictionaries
Dim myDict As AcadDictionary
Dim xrec As AcadXRecord
Dim data(0) As Variant
Dim types(0) As Integer

Set dicts = ThisDrawing.Database.Dictionaries

‘ 辞書が存在しなければ作成
On Error Resume Next
Set myDict = dicts.Item(DICT_NAME)
If myDict Is Nothing Then
Set myDict = dicts.Add(DICT_NAME)
End If
On Error GoTo 0

‘ 拡張レコード(XRecord)を作成してデータを格納
Set xrec = myDict.AddXRecord(KEY_NAME)

‘ データを格納(本来はここでBase64やハッシュ化を行うのがベスト)
data(0) = keyData
types(0) = 1 ‘ 文字列型を示すDXFコード

xrec.SetXData types, data
MsgBox “ライセンスキーを埋め込みました。”
End Sub

‘ — ライセンスを検証する関数 —
Public Function ValidateLicense() As Boolean
Dim myDict As AcadDictionary
Dim xrec As AcadXRecord
Dim resultTypes As Variant
Dim resultData As Variant

On Error GoTo HandleError

Set myDict = ThisDrawing.Database.Dictionaries.Item(DICT_NAME)
Set xrec = myDict.GetObject(KEY_NAME)

xrec.GetXData “”, resultTypes, resultData

‘ ここでresultData(0)の中身をチェック
If resultData(0) = “AUTHORIZED_2023” Then ‘ 簡易的な認証ロジック
ValidateLicense = True
Else
ValidateLicense = False
End If
Exit Function

HandleError:
ValidateLicense = False ‘ キーが見つからない場合は不正とみなす
End Function

4. エンジニアとして知っておくべき「落とし穴」

このコードを動かす上で、いくつか注意点があります。

  • エラーハンドリングの重要性:

`Dictionaries.Item(DICT_NAME)` を呼ぶ際、その辞書が存在しないとAutoCADは即座にエラーで停止します。必ず`On Error Resume Next`を用いて「存在確認」を行うフローを徹底してください。

  • データの永続性:

`XRecord`は図面と一緒に保存されます。しかし、誰かが`ENTDEL`コマンド等で意図的に辞書を削除する可能性もゼロではありません。セキュリティは「100%ではない」という前提で、多層的な防御(例えば、図面内の特定の画層名と組み合わせるなど)を考えるのが玄人の道です。

  • 暗号化の甘さ:

上記のサンプルでは文字列をそのまま入れていますが、実務では`XOR`演算や簡単なハッシュ関数を通すだけで、解析の難易度は格段に上がります。

5. 次のステップへ

「マクロが動く」という段階から、「運用を制御する」という段階へ。
今回紹介した `Dictionaries` と `XRecord` の組み合わせは、ライセンス管理だけでなく、「図面ごとの設定値の保存」にも極めて強力な武器になります。

「この図面には、どの担当者の、いつの承認データが入っているか?」といったメタデータを図面内に持たせることで、あなたのツールは単なる自動化ツールから、「組織のデータ管理基盤」へと進化します。

ここをクリアすれば、あなたはもう初級者ではありません。
自信を持って、次の複雑な課題に挑戦してください。何かあれば、いつでもこのコードを叩き台に議論しましょう。応援しています。

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