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

スポンサーリンク

AutoCAD VBAの深淵:図面内「暗号化ライセンスキー」埋め込みによる知的財産保護の実装

AutoCADのAPIを数十年触り続けていると、多くのエンジニアが「図面データのセキュリティ」という壁に突き当たる。図面ファイル(DWG)は、CADソフトで開けば誰でも編集可能な状態がデフォルトだ。しかし、社内ツールや独自ロジックを組み込んだシステムにおいては、図面単位での「使用権限」や「有効期限」を物理的に制限したいという要求が発生する。

今回は、AutoCADのオブジェクトデータベースの最深部、`Dictionaries`(辞書)を用いた、極めて堅牢なライセンス認証機構の構築法を伝授する。

1. なぜ「Dictionary」なのか?

AutoCADの図面データ構造において、`Dictionaries`は、グラフィカルな図形(Entity)とは異なる「非グラフィカルデータ」の格納庫だ。通常は名前付き画層フィルタや印刷スタイルなどが格納される場所だが、ここに我々独自の「カスタム辞書(Named Object Dictionary)」を作成し、`XRecord`(拡張レコード)としてバイナリデータを埋め込む。

これは、図面を別名保存しても、ブロックとしてコピーしても追従する。外部テキストファイルによるキー管理とは比較にならないほど、図面との結合強度は高い。

2. 実装の極意:Dictionariesへのアクセス構造

`AcadDocument.Database.Dictionaries`に対し、独自のキー名(例:`”ACAD_PROJ_AUTH”`)で新しい辞書を作成し、その中に`XRecord`を生成する。この`XRecord`こそが、暗号化されたライセンスキーの器となる。

核心となるVBA実装例

‘ 警告: 本コードはメモリ管理を徹底する必要がある。
‘ 参照の解放を怠ると、AutoCADのプロセスがゾンビ化する原因となる。
Public Sub EmbedLicenseKey(ByVal strKey As String)
Dim objDict As AcadDictionary
Dim objXRec As AcadXRecord
Dim dataType(0) As Integer
Dim dataVal(0) As Variant

‘ 1. Named Object Dictionaryへのアクセス
Set objDict = ThisDrawing.Database.Dictionaries.Add(“MY_PROJECT_AUTH”)

‘ 2. XRecordの作成
Set objXRec = objDict.AddXRecord(“LICENSE_DATA”)

‘ 3. データの型定義(DXFコード 1 は文字列を指す)
dataType(0) = 1
dataVal(0) = EncryptString(strKey) ‘ ここで暗号化ロジックを挟む

‘ 4. データの書き込み
objXRec.SetXRecordData dataType, dataVal

‘ メモリ最適化: 明示的な解放
Set objXRec = Nothing
Set objDict = Nothing

ThisDrawing.Regen acActiveViewport
End Sub

3. シニアエンジニアが意識すべき「防御」の階層

単に辞書に文字列を突っ込むだけでは、上級者には即座に解析される。以下の「極限の知見」を実装に加味せよ。

A. 難読化と暗号化の分離

`EncryptString`関数の中身は、単純なBase64ではいけない。Windows APIの `CryptAcquireContext` を呼び出し、OS標準の暗号化ライブラリを活用するか、あるいは図面固有の `Handle` IDをソルト(Salt)として利用せよ。

  • 知見: `ThisDrawing.Handle` をハッシュ関数にかけ、鍵生成のパラメータに含めることで、その図面でしか機能しない「特異的ライセンス」が完成する。

B. オブジェクトのライフサイクル管理

AutoCAD VBAはCOMラッパーである。`Set obj = Nothing` を怠れば、大規模なバッチ処理でメモリリークを引き起こす。

  • 知見: 常に `On Error GoTo` を活用し、例外発生時でも確実にオブジェクトを破棄する `Cleanup` ルーチンをスコープの最後に配置せよ。

4. 運用上の注意点:レガシーとの共存

この手法を導入する際、最も注意すべきは「他のプラグインとの干渉」である。`Dictionaries` の名前空間は共有領域であるため、必ず自社固有のプレフィックスを付与すること。

  • 推奨規約: `”{COMPANY_ID}_PROJ_LICENSE”` のように、GUIDに近い一意な名称を辞書名に採用せよ。

5. 終わりに:技術の責任

この認証機構は、あくまで「善良な利用者のためのガードレール」である。プロのハッカーや、AutoCADのデータベースを低レベルAPI(ObjectARX/C++)で直接編集する者に対しては、完全な防壁にはならない。

しかし、社内運用における「誤操作による流出」や「意図しないコピー利用」を防ぐには、これ以上に洗練された方法は存在しない。VBAの限界を理解し、その上でオブジェクトモデルの深淵を制御する――それこそが、我々エンジニアが手に入れるべき「制御の美学」である。

次回の講義では、このXRecordデータをWindows APIを用いて暗号化し、さらには外部データベースと照合する「ネットワーク照合型ライセンス機構」について掘り下げる。

コードは常に綺麗に。解放は怠りなく。

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