【実務・中級編】【純粋VBScriptデータ検証】ADODB.Stream による CRC32 チェックサム計算アルゴリズムの自作とファイル完全性検証 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:外部依存ゼロで実現する「CRC32完全性検証」の実践

業務自動化の現場において、外部コマンド(CertUtilやPowerShellの`Get-FileHash`など)を呼び出すのは、実は「負け」である。

なぜか。実行権限の制限、パスの環境依存、そして何より呼び出しのオーバーヘッド。これらは自動化の安定性を損なう最大の要因だ。VBScriptの本質は、OSのレイヤーに極限まで密着し、単体で完結することにある。

今回は、VBScriptの限界を突破し、`ADODB.Stream`を駆使してファイルバイナリを直接ハンドリングし、CRC32チェックサムを自前で実装する。このロジックを手にすれば、あなたは「環境に左右されない堅牢なデータ検証」を完全に手中に収めることになる。

1. なぜ「ADODB.Stream」なのか

VBScriptでファイルを扱う際、`Scripting.FileSystemObject`(FSO)はテキスト処理には適しているが、バイナリの断片的な読み込みには向かない。

`ADODB.Stream`を用いる理由はただ一つ。「巨大なファイルをメモリに展開することなく、ストリームとしてバイト単位で制御できるから」だ。これを使えば、数GBのファイルであっても、メモリを圧迫せずにハッシュ計算が可能になる。

2. VBScriptのビット演算の罠と攻略

VBScriptの演算において最大の障壁は、「数値がすべて32bit符号付き整数として扱われる」ことだ。特に`Long`型での計算中、符号ビット(最上位ビット)が1になると、意図せず負数として評価され、結果が壊れる。

これを回避するには、計算の過程で常に `&HFFFFFFFF` との `And` 演算を行い、符号を強制的に打ち消す「アンサイン(Unsigned)補正」が不可欠である。この作法を忘れた時点で、あなたのコードは動かない。

3. 実装:堅牢なるCRC32チェックサム計算機

以下のコードは、プロダクション環境での使用を想定したモジュールだ。そのままインポートして即戦力として機能する。

‘ CRC32 チェックサム計算クラス
Class CRC32Calculator
Private table(255)

‘ コンストラクタでCRCテーブルを生成(高速化の要)
Private Sub Class_Initialize()
Dim i, j, crc
For i = 0 To 255
crc = i
For j = 0 To 7
If (crc And 1) <> 0 Then
crc = ((crc And &HFFFFFFFE) \ 2) Xor &HEDB88320
Else
crc = (crc And &HFFFFFFFE) \ 2
End If
Next
table(i) = crc And &HFFFFFFFF
Next
End Sub

‘ ファイルから計算するメソッド
Public Function GetFileChecksum(filePath)
Dim stream, byteData, crc, i
Set stream = CreateObject(“ADODB.Stream”)
stream.Type = 1 ‘ adTypeBinary
stream.Open
stream.LoadFromFile filePath

crc = &HFFFFFFFF

Do While Not stream.EOS
‘ 1バイトずつ読み込み
byteData = AscB(stream.Read(1))
‘ CRCアルゴリズムの適用
crc = ((crc And &HFFFFFF00) \ &H100) Xor table((crc Xor byteData) And &HFF)
Loop

stream.Close
GetFileChecksum = Right(“00000000” & Hex(Not crc And &HFFFFFFFF), 8)
End Function
End Class

‘ — 利用例 —
Dim calc, result
Set calc = New CRC32Calculator
result = calc.GetFileChecksum(“C:\Data\ImportantFile.zip”)
WScript.Echo “Calculated CRC32: ” & result

4. プロダクション環境への導入・運用上の注意点

このコードを現場で運用する際、以下の3点に注意せよ。

  • バイトオーダーの理解: `ADODB.Stream`はバイナリ読み込みにおいて、システムのエンディアンに依存せず、常にバイト単位で正確な値を返すが、`Read(1)`の呼び出し回数が膨大になると速度が低下する。パフォーマンスがシビアな環境では、`Read(4096)`のようにバッファサイズを大きくして、配列内でビット演算を行うよう調整すること。
  • 例外処理の欠如: 上記コードは簡潔さを優先している。実際には `On Error Resume Next` を活用し、ファイルが開けない場合やアクセス権限がない場合に、適切なログを残して終了するガード節を必ず組み込むこと。
  • 整合性の証明: 本来、CRC32は単純な破損検知用であり、高度なセキュリティ用途(改ざん検知)には向かない。もし「悪意ある改ざん」の検知が必要なら、SHA-256への移行を検討すべきだ。ただし、VBScript単体でSHA-256を実装するのは非効率極まりない。その場合は、設計の段階で「検証ロジックをどこに置くか」を再定義すべきである。

結びに代えて

「古いから使えない」のではない。あなたが「使いこなせていない」だけだ。
VBScriptの真髄は、OSに深く根を張り、余計なライブラリに依存せず、必要なロジックを最小のフットプリントで実装することにある。

このCRC32検証ロジックをあなたの自動化ライブラリに加えれば、配布したファイルの完全性は常にあなたの監視下にある。環境を言い訳にせず、コードで問題を解決せよ。それがプロのエンジニアの流儀である。

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