はじめに
このエントリでは、VBScriptで一方向ハッシュ関数を使って、ハッシュ値を生成する方法について書いています。
結論
VBScriptにはSHA1やMD5といったアルゴリズムを用いてハッシュ値を生成する関数がありません。
このため、ハッシュ値の生成が必要な場合には、自力でハッシュ関数を作成するか、あるいは、以下に記載する方法で、外部のDLLを用いて、ハッシュ値を生成する必要があります。
MicrosoftのMicrosoft CAPICOMでハッシュ値を生成する
VBScriptでハッシュ関数を利用するには、Microsoftが無償で提供するCapicom.dllを利用します。手順は、以下のとおりです。
1.はじめにMicrosoftのページからCapicom.dllをダウンロードします。
2.ダウンロードしたファイルをダブルクリックして、インストーラを起動します。ウィザードに従い、Microsoft CAPICOMをインストールします。
3.インストールが完了すると、C:\Program Files\Microsoft CAPICOM 2.1.0.2 SDK\Lib\X86の下にcapicom.dllというファイルが存在します。続いて、コマンドプロンプトで以下のコマンドを実行し、このcapicom.dllをレジストリ登録します。
cd "C:\Program Files\Microsoft CAPICOM 2.1.0.2 SDK\Lib\X86" regsvr32 capicom.dll
これで、Microsoft CAPICOMの準備は完了です。
VBScriptからMicrosoft CAPICOMを利用する
VBScriptからMicrosoft CAPICOMを利用するには、以下のサイトのコードが参考になります。
サンプルコードをまるごと引用で申し訳ないのですが、次のようなコードを書きます。
Option Explicit Function DoHashCommand(ByVal lngAlgorithm, ByVal strContent) Dim strHashValue ' ハッシュ値 Dim objHashedData ' ハッシュ作成用 On Error Resume Next strHashValue = "" Set objHashedData = CreateObject("CAPICOM.HashedData") If Err.Number = 0 Then objHashedData.Algorithm = lngAlgorithm objHashedData.Hash strContent If Err.Number = 0 Then strHashValue = objHashedData.Value Else WScript.Echo "エラー: " & Err.Description End If Else WScript.Echo "エラー: " & Err.Description End If Set objHashedData = Nothing DoHashCommand = strHashValue End Function Dim strContent ' ハッシュ作成文字列 Dim strAlgo ' ハッシュアルゴリズム Dim lngLoop ' ループカウンタ strContent = "hash test" strAlgo = Array("SHA1", "MD2", "MD4", "MD5") WScript.Echo "文字列: " & strContent For lngLoop = 0 To UBound(strAlgo) WScript.Echo strAlgo(lngLoop) & ": " & _ DoHashCommand(lngLoop, strContent) Next
このスクリプトを名前をつけて保存し、コマンドプロンプトから実行すると以下のような結果が得られます。
C:\work>cscript HashGenerater.vbs Microsoft (R) Windows Script Host Version 5.7 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. 文字列: hash test SHA1: DCB12E70AFEE6D8A86091767CC753851305C043A MD2: 785176A0CB72FF8E3BA9C0B6F8141E49 MD4: E0C287023917CEE9E539300BACAD08A2 MD5: 1E25FCDC4379021015CDED273988470A
ちなみにcapicom.dllのレジストリ登録を行う前にこのスクリプトを実行すると、以下のような結果となってしまいます。
文字列: hash test エラー: ActiveX コンポーネントはオブジェクトを作成できません。 SHA1: エラー: ActiveX コンポーネントはオブジェクトを作成できません。 MD2: エラー: ActiveX コンポーネントはオブジェクトを作成できません。 MD4: エラー: ActiveX コンポーネントはオブジェクトを作成できません。 MD5: