【入門編】【簡易難読化】FSOで処理する機密テキストの内容をVBScript内で文字コード変換・難読化して読み書きする手法 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!VBScriptの世界へようこそ。
業務の自動化を進めていると、「設定ファイルにパスワードや機密情報をそのまま書いておくのは、セキュリティ的にちょっとマズいよなぁ…」と悩む瞬間が必ずやってきます。

メモ帳を開けば誰でも丸見えのパスワードファイル。これをどうにかして、パッと見では意味不明な文字列に変換し、VBScriptが動くときだけ元の意味ある情報に戻す(デコードする)。
今回は、ファイルシステムオブジェクト(FSO)を駆使して、「簡易的な難読化・文字コード変換による機密情報の保護」を実現する極意を伝授します。

ここをクリアすれば、単なるファイルの読み書きから一歩進んだ、「現場で使えるセキュアな自動化スクリプト」が書けるようになりますよ。さあ、一緒に扉を開きましょう!

—

なぜ「簡易難読化」が必要なのか?

大規模なシステムであれば、専用の暗号化ライブラリや環境変数を使うのが定石です。しかし、VBScriptが単体で動くようなローカルのWindows環境や、ちょっとした業務自動化バッチ(.vbs)の世界では、過剰なセキュリティはかえってメンテナンス性を落とします。

ここで目指すのは、「肩越しにチラッと見られても、あるいはデスクトップに放置されても、一目でパスワードだとバレない状態」にすることです。

今回使う武器:シフト演算(簡易Cesar cipher風)の思想

文字コードを一定数ズラす(シフトする)という、暗号の歴史の基本にして強力なアプローチを使います。

  • 書き込み時(エンコード): 文字の内部コード(文字コード)に特定の数値を足して、読めない文字に変えてFSOで保存する。
  • 読み込み時(デコード): FSOで読み込んだ文字のコードから、先ほど足した数値を引いて、元の文字列に戻す。

これだけで、平文(生のテキスト)をそのままファイルに放置するリスクからおサラバできます。

—

実装コード:機密情報を守るシールド付きFSOスクリプト

それでは、実際に動くコードを見てみましょう。
デスクトップなどに `secure_config.vbs` という名前で保存し、文字コード「ANSI(またはShift-JIS)」で保存して実行してみてください。

‘ =================================================================0
‘ 署名: FSOによる機密情報の簡易難読化・読み書きサンプル
‘ 概要: パスワード平文化の恐怖からあなたを救う、愛の難読化スクリプト
‘ =================================================================0
Option Explicit

Dim fso, filePath, plainText, encodedText, decodedText
Dim shiftKey

‘ 1. オブジェクトの生成と初期設定
Set fso = CreateObject(“Scripting.FileSystemObject”)
filePath = fso.BuildPath(fso.GetSpecialFolder(0), “secret_config.dat”) ‘ Windowsフォルダ付近にテスト作成(適宜変更可)
shiftKey = 5 ‘ 文字コードをずらす秘密の鍵(オフセット値)

‘ —【テストデータ作成】—
plainText = “MySuperSecretPassword123”
WScript.Echo “【1】元の平文: ” & plainText

‘ 2. エンコード(難読化)処理
encodedText = EncodeString(plainText, shiftKey)
WScript.Echo “【2】難読化後: ” & encodedText

‘ 3. FSOを使ってファイルに書き出す
Call WriteTextFile(fso, filePath, encodedText)
WScript.Echo “【3】ファイルを保存しました: ” & filePath

‘ 4. FSOを使ってファイルから読み込む
encodedText = ReadTextFile(fso, filePath)
WScript.Echo “【4】ファイルから読み込み(難読状態): ” & encodedText

‘ 5. デコード(復元)処理
decodedText = DecodeString(encodedText, shiftKey)
WScript.Echo “【5】復元された平文: ” & decodedText

‘ =================================================================0
‘ 関数群:ここから下がエンジニアの技の見せ所です
‘ =================================================================0

‘ 文字列を難読化する関数
Function EncodeString(ByVal str, ByVal key)
Dim i, result, charCode
result = “”
For i = 1 To Len(str)
‘ 1文字ずつ取り出し、文字コード(Unicode)に変換してキーを足す
charCode = AscW(Mid(str, i, 1)) + key
‘ 再び文字に戻して連結
result = result & ChrW(charCode)
Next
EncodeString = result
End Function

‘ 難読化された文字列を元に戻す関数
Function DecodeString(ByVal str, ByVal key)
Dim i, result, charCode
result = “”
For i = 1 To Len(str)
‘ 1文字ずつ取り出し、文字コードからキーを引く
charCode = AscW(Mid(str, i, 1)) – key
‘ 再び文字に戻して連結
result = result & ChrW(charCode)
Next
DecodeString = result
End Function

‘ FSOでファイルにテキストを書き込むプロシージャ
Sub WriteTextFile(fsoObj, path, contents)
Dim stream
‘ ForWriting (2) と Create (True) を指定してテキストストリームを開く
Set stream = fsoObj.OpenTextFile(path, 2, True)
stream.Write contents
stream.Close
Set stream = Nothing
End Sub

InfoSub ‘ FSOでファイルからテキストを読み込む関数
Function ReadTextFile(fsoObj, path)
Dim stream, contents
‘ ForReading (1) でファイルを開く
Set stream = fsoObj.OpenTextFile(path, 1)
contents = stream.ReadAll
stream.Close
Set stream = Nothing
ReadTextFile = contents
End Function

—

コードの核心:なぜこの書き方が美しいのか?

初心者の方に向けて、このコードの重要なポイントを3つの視点から解説します。

1. `AscW` と `ChrW` のコンビネーション

VBScriptには `Asc` や `Chr` という関数もありますが、これらは環境の文字コード(ANSI)に依存するため、全角文字や特殊記号を扱う際に化けやすいという弱点があります。
`AscW`(Wide character版)を使うことで、Unicodeベースの正確な文字コードを取得し、安全に数値を足し引き(シフト)することができます。

2. オブジェクトの寿命管理(ライフサイクル)

FSOを扱う際、`CreateObject` で生成したオブジェクトや、`OpenTextFile` で開いたテキストストリーム(TextStream)は、使い終わったら明示的に `Set stream = Nothing` や `Set fso = Nothing` と解放してメモリをキレイに掃除する癖をつけましょう。
これを怠ると、スクリプトが肥大化したときにメモリリークの原因になります。「使ったら閉じる、閉じたら捨てる」、これが一流のエンジニアの作法です。

3. FSOの定数スマート活用

`OpenTextFile(path, 2, True)` の `2` は「書き込みモード(ForWriting)」、`True` は「ファイルが存在しない場合に新規作成する(Tristate / Create)」という意味です。マジックナンバー(意味不明な数字)を直接書く代わりに、定数として意味を意識しながら使うとバグが激減します。

—

陥りやすい罠とエラー回避の知恵

この手法を実務で使うとき、多くの人がハマる罠がいくつかあります。

  • 罠1: 改行コードや制御文字が含まれる場合

今回のシンプルな文字シフト方式は、改行コード(CR/LF)の文字コード自体もズラしてしまいます。もし複数行のテキストを保存したい場合は、改行ごとに配列に分割してからエンコードするか、全体の文字列ではなく1文字単位の演算が正しく機能するかテストしてください(※上記コードは1行のパスワードやトークン文字列を想定しています)。

  • 罠2: 「絶対に安全」と過信しないこと

あくまで「簡易難読化」です。プログラミングの基礎を知っている人がデコード関数を見れば、数分で元の文字列に戻されてしまいます。社内の覗き見防止や、誤ってGitや共有フォルダに生パスワードを晒してしまう事故を防ぐための「最低限の防波堤」として捉えてください。

—

おわりに

お疲れ様でした!
今回学んだ「FSOによる入出力」と「文字コードのビット/数値操作」の組み合わせは、VBScriptだけでなく、あらゆるプログラミング言語(VBAやPythonなど)に通じる普遍的なデータ処理の基礎です。

「ただファイルを読み書きするだけ」のスクリプトから、「データを守る知恵を持った」セキュアなスクリプトへ。
あなたの自動化ツールは、今日から一段階レベルアップしました。

ここをクリアしたあなたなら、どんな複雑な業務自動化の要件が来ても怖くありません。自信を持って、次のステップへ進んでくださいね!

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