Windowsスクリプト テクニック

 

VBScriptで暗号化/復号化する    (記:2008/05/18、更新:2008/05/19)

VBScriptでWMIなどを使用していると、パスワードを暗号化しておきたい場面などに出くわすだろう。
大抵はメンドウなのでそのまま埋め込んだりパラメータ渡しにしたりしていると思うが、タスクスケ
ジューラ上でスクリプトを実行させたりする際には、セキュリティも考慮しなければならない。

Windows上で暗号化/復号化を行うにはCrypto APIを利用したいところだが、COM化したMicrosoft
社製CAPICOMを使うには、別途ダウンロード&インストールが必要になってしまう。(タダではあるが)
ダウンロードはともかく、インストールとなると制限を受けるユーザアカウントも学校や企業といった
所では十分考えられるだろう。
そこで、ここではOS標準機能だけで暗号化/復号化する手段を考えてみた。

※ 多分IEの機能を使っているのだと思われるので、あんまり古いIEだと出来ないかもしれない。
  Windows2000以降&IE6以降なら問題ないと思うが...

勘が良いというか他言語にも詳しい方なら気づいたかもしれないが、CreateObjectしているモジュール
「System.Security.〜」は .NET Framework のクラス定義と同じである。だが、別に .NET Framework が
インストールされている必要はない(インストールされてなくても動く)。 .NET Framework の方がOS標準
の機能として取り込んでいるのだろう。

 

<注意>
暗号化カギや暗号化された値を外部や他のアカウントから読み取られないように考慮すること!
特に暗号化カギを保存する場合は、保存先のセキュリティや保存方法(最低でもパッと見で分からない
程度にはしておくことを薦める)には最新の注意を払うこと。

Dim strSrcTextValue ' 暗号化したい文字列
Dim binEncryptValue ' 暗号化された値(バイナリ値:SafeArry)
Dim binDecryptValue ' 復号化された値(バイナリ値:SafeArry)
Dim strDecryptValue ' 復号化された文字列  

strSrcTextValue = "abc"

' 定義
' ADODB.Stream

Const adTypeBinary = 1
Const adTypeText = 2
Const adSaveCreateNotExist = 1
Const adSaveCreateOverWrite = 2
Const adReadAll = -1
Const adReadLine = -2

' Original
Const csUnicode = unicode" ' Script Default
Const csUTF8 = "utf-8"
Const csJIS = "iso-2022-jp"
Const csShiftJIS = "Shift_JIS"
Const csEUCJP = "euc-jp"

' バイナリを扱うために ADODB.Stream を使用する
Set objStream = CreateObject("ADODB.Stream")

' レジストリの「HKEY_CLASSES_ROOT\System.Security.Cryptography.〜Provider」 群を
' 見れば、使用できる暗号の種類が分かる。ここではRSA暗号化を指定している

Set objCrypt = CreateObject("System.Security.Cryptography.RSACryptoServiceProvider")

 

' Encrypt
' ストリームをオープンして暗号化したい文字列を書き込む

objStream.Open

objStream.Type = adTypeText
objStream.Charset = csUnicode
objStream.WriteText strSrcTextValue

' ストリームをバイナリ指定にしてvbSafeArray(配列)をEncrypt に渡して暗号化する
' (Encrypt/Decryptには 8209型 = vbArray(8192) + vbByte(17)が要求される)
' これで binEncryptValue に暗号化された値がバイナリ値で格納された状態になるので
' 文字列化するなりそのままバイナリ値として、ファイルに書き込んだりレジストリに格納
' すれば良いだろう

objStream.Position = 0
objStream.Type = adTypeBinary
binEncryptValue = objCrypt.Encrypt(objStream.Read(adReadAll), False)
objStream.Close

' XMLでカギ情報を出力(True:秘密カギと公開カギを出力、False:公開カギのみ出力)
'   このプロセス内でのみ暗号化/復号化したい場合は必要ないが、後で使用したいような場合は
'   カギ情報を残しておかないとならない。
'   ※間違っても平文で他人も見えるような場所に保存してはならない!

strXML = objCrypt.ToXmlString(True)


' 暗号化カギを格納しているXMLを入力する(XMLは保存先から別途何らかの方法で読み込むこと)
' これにより、プロセスを終わらせても暗号化/復号化の続きができる。

objCrypt.FromXmlString(strXML)

 

' Decrypt
' ストリームに暗号化されたバイナリ値を格納する

' 暗号化されたバイナリ値をファイルから読み込みたい場合はWriteではなくLoadFromFileする
objStream.Open
objStream.Type = adTypeBinary
objStream.Write binEncryptValue

' ストリームをバイナリ指定にしてvbSafeArray(配列)をDecrypt に渡して復号化する
objStream.Position = 0
binDecryptValue = objCrypt.Decrypt(objStream.Read(adReadAll), False)
objStream.Close

' Unicode Textのバイトオーダーを示す BOM コードを削除する
' これによりスクリプト上で通常の文字列として比較などが行えるようになる

strDecryptValue = Mid(binDecryptValue, 2)
WScript.Echo "Decrypt: " & strDecryptValue

 

' 終了処理
Set objCrypt = Nothing
Set objStream = Nothing

 


Copyright(C) RainyLain 2008