Windows > WSH > パスワード自動生成スクリプト

パスワード自動生成スクリプト



コード

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]
最終更新:2009年11月03日 23:02
添付ファイル