【入門編】【安全なランダムパスワード生成】Chr 関数と Randomize / Rnd を組み合わせた強度指定型パスワード作成ジェネレータ – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

世の中には、便利な自動化ツールが溢れています。しかし、真のエンジニアであれば「なぜそのコードが動くのか」、そして「どうすれば安全に制御できるのか」という根源的な問いから逃げてはいけません。

今回は、VBScriptを使いこなすための登竜門であり、かつ実務で即戦力となる「高強度ランダムパスワード生成器」を題材に、この言語の深淵を覗いてみましょう。

なぜ、今さらVBScriptなのか?

「Pythonがあるのに、なぜVBScript?」そう思うかもしれません。しかし、Windows環境であれば、追加のインストールなしで、メモ帳一つですぐに動かせる。この「ポータビリティ(持ち運びのしやすさ)」こそが、VBScriptの最大の武器です。

現場のPC環境が厳格に制限されている中で、瞬時に課題を解決する。そんな「駆け込み寺」としての役割を、この言語は今も担い続けています。

1. 乱数の「呪い」と Randomize の真実

VBScriptで乱数を生成するとき、多くの初心者が `Rnd` 関数を単体で使い、失敗します。

‘ 危険な例:これでは毎回同じ結果が返ってくる
MsgBox Rnd

`Rnd` 関数は、実は「決まった順序の数列」を返すだけの関数です。PCを起動するたびに同じ数列が生成されるため、パスワード生成には向きません。ここで登場するのが `Randomize` です。

`Randomize` を実行することで、PCの内蔵時計をシード(種)として数列をリセットします。「乱数を使う直前に、必ず Randomize を呼ぶ」。これが、VBScriptでカオスを制御するための鉄則です。

2. 実装:強度指定型パスワードジェネレータ

では、業務レベルでも通用する、文字種を指定できるジェネレータを見ていきましょう。

‘ — SecurePasswordGenerator.vbs —
Option Explicit ‘ 強制的な変数宣言(バグを防ぐための必須作法)

Function GeneratePassword(length, useUpper, useLower, useNumbers, useSymbols)
Dim charPool, result, i
charPool = “”

‘ 文字プールの構築
If useUpper Then charPool = charPool & “ABCDEFGHIJKLMNOPQRSTUVWXYZ”
If useLower Then charPool = charPool & “abcdefghijklmnopqrstuvwxyz”
If useNumbers Then charPool = charPool & “0123456789”
If useSymbols Then charPool = charPool & “!@#$%^&()-_=+”

If charPool = “” Then
GeneratePassword = “Error: 文字種が選択されていません。”
Exit Function
End If

‘ 乱数シードの初期化
Randomize

result = “”
For i = 1 To length
‘ 1からcharPoolの長さまでの整数を取得
‘ Int(Rnd 上限) + 下限 という定石
Dim index
index = Int(Rnd Len(charPool)) + 1
‘ Mid関数で一文字ずつ抽出
result = result & Mid(charPool, index, 1)
Next

GeneratePassword = result
End Function

‘ 実行テスト:16文字、英数字と記号を含むパスワードを生成
MsgBox “生成されたパスワード: ” & GeneratePassword(16, True, True, True, True)

コードの重要ポイント解説

1. `Option Explicit`: これを先頭に書かないのは、戦場に防弾チョッキを着ずに行くようなものです。スペルミスによる変数の誤生成を未然に防ぎます。
2. `Mid(string, start, 1)`: 文字列から任意の一文字を切り出す基本テクニックです。
3. `Int(Rnd Len(charPool)) + 1`: 0以上1未満の小数に範囲を掛け、整数に切り捨てることで「指定範囲内のランダムなインデックス」を作ります。

3. 陥りやすい「罠」と対策

初心者がよくやる失敗パターンを挙げておきます。

  • 「文字が毎回同じ」: 前述の通り `Randomize` の忘れです。ループの外で一度呼べば十分です。
  • 「記号がパスワードに使えない」: `Mid` 関数などで扱う際、ダブルクォーテーション(`”`)自体をパスワードに含めたい場合は、文字列内では `””` と重ねる必要がある点に注意してください。
  • 「無限ループ」: もし `For` 文の条件を `While` などで書く場合、終了条件を忘れるとプロセスがCPUを占有し続けます。必ず終了条件を明確にしましょう。

最後に:エンジニアとしての心構え

VBScriptは古い言語ですが、その裏側にある「メモリの管理」や「オブジェクトの参照」といった概念は、現代の言語にも共通するプログラミングの基礎体力です。

このコードを動かせたなら、あなたはもう「マクロの記録」ボタンを押すだけの存在ではありません。システムを意のままに操るエンジニアの第一歩を踏み出しました。次は、このスクリプトを `FileSystemObject` と組み合わせて、生成したパスワードを安全なテキストファイルに保存する自動化に挑戦してみてください。

迷ったらまたここへ来てください。コードの書き方だけでなく、その向こう側にある本質を、いつでもお教えしますよ。

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