パスワード自動生成スクリプト
コード
Option Explicit
' パスワードソース配列を作成します。
' 引数
' aSource ソース文字配列を受け取るための参照を指定します。
' aReading 読み仮名文字列を受け取るための参照を指定します。
' 戻り値
' 作成に成功した場合、Boolean値Trueを返します。
' そうでない場合、Falseを返します。
' 現在Falseを返すことはありません。
Function CreatePasswrodSource(ByRef aSource, ByRef aReading)
' 各文字ソース
' 数字
Dim aDigitC, aDigitR
aDigitC = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
aDigitR = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
' 英語小文字
Dim aLCaseC, aLCaseR
aLCaseC = Array( _
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", _
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", _
"u", "v", "w", "x", "y", "z")
aLCaseR = Array( _
"エー", "ビー", "シー", "ディー", "イー", "エフ", "ジー", "エイチ", "アイ", "ジェイ", _
"ケー", "エル", "エム", "エヌ", "オー", "ピー", "キュー", "アール", "エス", "ティー", _
"ユー", "ヴイ", "ダブリュー", "エックス", "ワイ", "ゼット")
' 英語大文字
Dim aUCaseC, aUCaseR
aUCaseC = Array( _
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", _
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", _
"U", "V", "W", "X", "Y", "Z")
aUCaseR = Array( _
"エー", "ビー", "シー", "ディー", "イー", "エフ", "ジー", "エイチ", "アイ", "ジェイ", _
"ケー", "エル", "エム", "エヌ", "オー", "ピー", "キュー", "アール", "エス", "ティー", _
"ユー", "ヴイ", "ダブリュー", "エックス", "ワイ", "ゼット")
' 記号
' 使用可能な記号については Microsoftアナウンス
' http://windows.microsoft.com/ja-JP/windows-vista/Tips-for-creating-a-strong-password より
' 読み方は JISX0201 より
Dim aSymbolC, aSymbolR
aSymbolC = Array( _
"`", "~", "!", "@", "#", _
"$", "%", "^", "&", "*", _
"(", ")", "_", "-", "+", _
"=", "{", "}", "[", "]", _
"\", "|", ":", ";", """", _
"'", "<", ">", ",", ".", _
"?", "/")
aSymbolR = Array( _
"バッククォート", "チルダ", "感嘆符", "アットマーク", "シャープ", _
"ドル記号", "パーセント", "ハット", "アンパサンド", "アスタリスク", _
"左括弧", "右括弧", "アンダースコア", "ハイフン", "プラス", _
"イコール", "左中括弧", "右中括弧", "左大括弧", "右大括弧", _
"円記号", "パイプ", "コロン", "セミコロン", "ダブルクォート", _
"シングルクォート", "小なり", "大なり", "カンマ", "ピリオド", _
"疑問符", "スラッシュ")
' 仕様
' 各パスワードソースに対する含有期待率をおおよそ以下になるように調整します
' 数字(10) : 英小文字(26) : 英大文字(26) : 記号(32) = 3 : 3 : 3 : 1
' → *9 *3 *3 *1
' (記号が多いと使いづらいため、ソース文字の分布を一定の倍率で出現分布を調整)。
''''''''''''''''''''''''''''''''''''''''''''
'結合文字列の作成
Dim vLength
vLength = 9*(UBound(aDigitC) + 1) + 3*(UBound(aLCaseC) + 1) + 3*(UBound(aUCaseC) + 1) + (UBound(aSymbolR) + 1)
ReDim aSource(vLength)
ReDim aReading(vLength)
''''''''''''''''''''''''''''''''''''''''''''
'結合
Dim vI, vJ, vPos
vPos = 0
For vJ = 1 To 9 Step 1
For vI = 0 To UBound(aDigitC) Step 1
aSource(vPos + vI) = aDigitC(vI)
aReading(vPos + vI) = aDigitR(vI)
Next 'vI
vPos = vPos + UBound(aDigitC) + 1
Next 'vJ
For vJ = 1 To 3 Step 1
For vI = 0 To UBound(aLCaseC) Step 1
aSource(vPos + vI) = aLCaseC(vI)
aReading(vPos + vI) = aLCaseR(vI)
Next 'vI
vPos = vPos + UBound(aLCaseC) + 1
Next 'vJ
For vJ= 1 To 3 Step 1
For vI = 0 To UBound(aUCaseC) Step 1
aSource(vPos + vI) = aUCaseC(vI)
aReading(vPos + vI) = aUCaseR(vI)
Next 'vI
vPos = vPos + UBound(aUCaseC) + 1
Next 'vJ
For vJ = 1 To 1 Step 1
For vI = 0 To UBound(aSymbolC) Step 1
aSource(vPos + vI) = aSymbolC(vI)
aReading(vPos + vI) = aSymbolR(vI)
Next 'vI
vPos = vPos + UBound(aSymbolC) + 1
Next 'vJ
CreatePasswrodSource = True
End Function
' パスワードを生成します。
' 引数
' rPassword 生成したパスワードを受け取るための参照を指定します。
' rReading 生成したパスワード読み方を受け取るための参照を指定します。
' aSource パスワード生成のための文字配列参照を指定します。
' aReading パスワード読み方生成のための読み方配列参照を指定します。
' vLength 生成する文字長さを指定します。
' 6以上の整数を指定しなければなりません。
' vDelimiter パスワード読み方のデリミタ文字を指定します。
' 戻り値
' 生成に成功した場合Boolean値Trueを返します。
' そうでない場合Falseを返します。
Function CreatePassword(ByRef rPassword, ByRef rReading, ByRef aSource, ByRef aReading, vLength, vDelimiter)
' 引数チェック
If ((UBound(aSource) < 0) Or (UBound(aReading) < 0) Or (vLength < 6) Or Len(vDelimiter) = 0) Then
CreatePassword = False
Exit Function
End If
' パスワードの生成
Call Randomize
Dim vI, v, vSourceSize
vSourceSize = UBound(aSource) + 1
For vI = 1 To vLength Step 1
v = Int(Rnd*vSourceSize) '0~(vSourceSize - 1)の整数乱数
If (vI > 1) Then
rPassword = rPassword & aSource(v)
rReading = rReading & " " & aReading(v)
Else
rPassword = aSource(v)
rReading = aReading(v)
End If
Next 'vI
CreatePassword = True
End Function
' パスワードの複雑さの要件を満たすかどうか?評価します。
' 引数
' vPassword 評価対象のパスワード文字列を指定します。
' vLength 要件のパスワード長さを示す整数を指定します。
' 戻り値
' 要件を満たす場合Boolean値Trueを返します。
' そうでない場合Falseを返します。
Function IsPasswordComplex(vPassword, vLength)
Dim bDigit, bLCaseA, bUCaseA, bSymbol
bDigit = False
bLCaseA = False
bUCaseA = False
bSymbol = False
' パスワード長のチェック
If (Len(vPassword) < vLength) Then
IsPasswordComplex = False
Exit Function
End If
' 先頭から順番にチェック
' ※ 記号の評価方法が少々強引
Dim vI, vScore
For vI = 1 To Len(vPassword) Step 1
Dim vChar
vChar = Mid(vPassword, vI , 1)
If ((Asc("0") <= Asc(vChar)) And (Asc(vChar) <= Asc("9"))) Then
bDigit = True
ElseIf ((Asc("a") <= Asc(vChar)) And (Asc(vChar) <= Asc("z"))) Then
bLCaseA = True
ElseIf ((Asc("A") <= Asc(vChar)) And (Asc(vChar) <= Asc("Z"))) Then
bUCaseA = True
Else
bSymbol = True
End If
Next 'vI
' スコアリング
vScore = 0
If (bDigit) Then
vScore = vScore + 1
End If
If (bLCaseA) Then
vScore = vScore + 1
End If
If (bUCaseA) Then
vScore = vScore + 1
End If
If (bSymbol) Then
vScore = vScore + 1
End If
If (vScore >= 3) Then
IsPasswordComplex = True
Else
IsPasswordComplex = False
End If
End Function
Dim bResult
' パスワードソースの生成
Dim aSource(), aReading()
bResult = CreatePasswrodSource(aSource, aReading)
' パスワードの生成
Dim vPassword, vReading, vCount
vCount = 1
bResult = CreatePassword(vPassword, vReading, aSource, aReading, PASSWORD_LENGTH, " ")
bResult = IsPasswordComplex(vPassword, PASSWORD_LENGTH)
Do Until (bResult)
bResult = CreatePassword(vPassword, vReading, aSource, aReading, PASSWORD_LENGTH, " ")
bResult = IsPasswordComplex(vPassword, PASSWORD_LENGTH)
vCount = vCount + 1
Loop
Call WScript.Echo(vPassword & "(" & vReading & ")")
最終更新:2009年11月03日 23:02