こんにちは朱夏です。
今回は、VBScriptを使って、ランダムな文字列で初期パスワードを作成するツールを作ってみたいと思います。
今の職場では、パスワードを忘れてしまったので初期化して欲しいという依頼が頻繁にくる。
予測されないパスワードを簡単に作成できれば、リスクも時間も減らせそう。
というわけで、現場で使うためのツール作成になります。
それではいってみましょう。
作成したコード
実行結果
パスワードが偏る時(2022/12/27追記)
あとがき
作成したコード
今回参考にさせていただいたサイトはこちら。
調べていた中では比較的簡単な仕組みで作られていたのが参考にいした理由ですね。
コードはこちらです。
Const TITLE = "初期パスワード作成ツール" Dim size Dim test Do size = InputBox("パスワードの文字数を指定してください。", TITLE) If IsNumeric(size) Then size = CInt(size) Exit Do Else MsgBox "数字で入力してください" End If Loop InputBox "コピーして使ってください。", TITLE, strInitialPW(size) Function strInitialPW(size) Dim chars Dim str Dim i chars = "0123456789" _ & "ABCDEFGHIJKLMNOPQRSTUVWXYZ" _ & "abcdefghijklmnopqrstuvwxyz" str = "" For i = 1 To size str = str & Mid(chars, Int(Rnd * Len(chars) + 1), 1) Next strInitialPW = str End Function
新しい要素がたくさん出て来たので一つずつ解説を残しておきたいと思います。
Do ~ Loop
間に書かれた処理を無限に繰り返します。
ループから抜け出すにはExit Doを使います。
IsNumeric(size)
渡した引数が数値かどうかを判断する関数です。
今回は、InputBoxで入力した値(size)が数値かどうかを判断しています。
size = CInt(size)
CInt関数は、データを数値として扱うように指示する関数です。
VBScriptでは、変数にどんなデータも入れられるので、数値としてだけ扱いたい場合などは、型を指定してあげる必要があります。
chars
パスワードで使用する文字を格納しています。
途中にある”_(アンダースコア)”は、プログラム内で改行したいときに使うものの様です。
コードを見やすくするための処置ですね。
str = str & Mid(chars, Int(Rnd * Len(chars) + 1), 1)
ここにはたくさん新しい要素が詰まっていました。
以下の要素を解説していきます。
Mid関数
指定した文字列から特定の文字を取り出します。
指定方法は以下の様に行います。
処理の流れとしては以下の様になります。
-
-
- 検索対象の文字列を指定
- 取得開始場所が、文字列の左から何文字目かを指定
- 取得開始場所から、何文字取得するかを指定
-
今回の場合、左からn番目の文字を1文字を取得するといった処理になっています。
Int関数
扱う数値の小数点以下を切り捨てる関数です。
Rnd関数
0~1の間でランダムの数値を取得します。
必然的に小数点以下の数値を取得することになります。
Len関数
指定した文字列の文字数を取得する関数です。
これらを組み合わせて、PWに使用する文字群の中からランダムで1文字ずつ取得して、パスワードの文字列に追加していく処理を作っています。
For~Next
繰り返し処理を行う関数です。
今回は入力したパスワードの桁数分ランダムで文字を取得する処理を繰り返すように指定しています。
実行結果
上記のコードを実行するとこんな画面が出てきます。
何もいれなかったり、数値以外の文字を入力して次に進もうとすると、以下の様なメッセージが出てきます。
数値を入力後、OKを押すと、作成したパスワードが表示されます。
今回は8を入力してみました。
こんな感じで、問題なくパスワードが作成されました。
パスワードが偏る時(2022/12/27追記)
今回のコードを繰り返し実行していると、同じパスワードが連続で生成されることがあります。
その場合、For文のすぐ下に行を追加して、”Randomize”と入力してみてください。
これで、同じパスワードになる事は減るはずです。
~~
~~
For i = 1 To size
Randomize
str = str & Mid(chars, Int(Rnd * Len(chars) + 1), 1)
Next
strInitialPW = str
End Function
Randomize
Rnd関数の乱数ジェネレーターを初期化するものらしいです。
シード値が新しいものに更新されるんだそうな。
ひとまずは、乱数を繰り返し取得したい場合に同じ結果にならないようにするための1行という認識でよい気がします。
また必要になったら詳しく勉強したいと思います。
あとがき
というわけで、パスワード作成ツールを作ってみました。
パスワードなどのランダムな文字列を作成したい場合の方法として、一番多く出てきたのは、ランダムな数値を組み合わせて文字コードを使う方法でした。
そんな中、今回参考にしたサイトは、パスワードに使用する文字を文字列として用意して、配列に見立てて使用する方法でとても分かりやすかった。
これだと、”0(ゼロ)”と”O(大文字のオー)”など区別がつきにくい文字をパスワードの文字として使用しない事や、文字として使用したい記号を追加するなどのカスタマイズがしやすいのでとても便利でした。
何事も一般的だからってそれが正しいとは限らないという事ですね。
今回は以上です。
次回もよろしくお願いします。