批量生成包含大写/小写和数字的密码的脚本

批量生成包含大写/小写和数字的密码的脚本

写起来应该很简单,但我宁愿使用现有的解决方案来节省时间......

是否有人知道一个脚本可以生成给定长度的密码,使得每个密码至少包含一个大写字母、一个小写字母和一个数字?到目前为止,我发现的每个脚本都将使用大写/小写/数字作为字符池,但不能确保输出中至少有一个字符。

我需要生成大约 3000 个这样的密码作为一些批量帐户创建工作的初始密码。

答案1

使用 pwgen 执行此操作:

pwgen -cn 8 3000

这将生成 3000 个 8 个字符的密码,其中至少有一个大写字母和至少一个数字。

答案2

我使用过的 vbscript 仍可在网上找到这里(嘿,它比我现有的要新)。总有一天我会把它转换成 powershell。我会把它发布在下面,以免你重新查找它的麻烦:

'==========================================================================
'
' NAME: RandomPasswordGenerator.vbs
'
' AUTHOR: Mark D. MacLachlan , The Spider's Parlor
' URL: http://www.thespidersparlor.com
' DATE  : 7/29/2004
' MODIFICATIONS:
'         9/2/2008 Added dictionary object to ensure 
'                  uniqueness of passwords
'
' COMMENT: Generates Random Passwords meeting "Complex" Requirements
'          By default will generate a 6 digit password.
'          Edit line passLen = 6 to change length
'==========================================================================
Option Explicit

Dim pGenNum, newpass, passList, inFlag, pgLength, x, fso, ts, passLen
Const ForWriting = 2
passLen = 6

'Give inFlag (input Flag) an initial value to ensure we run once
inFlag = "Seed"

Do While inFlag <> pGenNum
    pGenNum = InputBox("How many passwords would you like to create?" & vbCrLf & _ 
    "Enter a Numeric Value" & vbCrLf & _
    "Blank Entry Will Cancel Script","Enter Number of Passwords to Create")

    'Quit if no entry
    If pGenNum = "" Then WScript.Quit

    'Now clear inFlag so we can compare it to the pGenInput going forward
    inFlag = ""
    pgLength = Len(pGenNum)
    'Enumerate each character to ensure we only have numbers
    For x = 1 To pgLength
        If Asc(Mid(pGenNum,x,1)) < 48 Or Asc(Mid(pGenNum,x,1)) > 57 Then
            inFlag = ""
        Else
            'Build inFlag one character at a time if it is a number. 
            inFlag = inFlag & Mid(pGenNum,x,1)
        End If
    Next
    'We made it through each character.  If not equal prompt for a number.
    If inFlag <> pGenNum Then inFlag = ""
Loop

'Generate the number of required passwords.
'Use a dictionary object to ensure uniqueness.
Dim objDict
Set objDict = CreateObject("Scripting.Dictionary")
Do Until objDict.Count = CInt(pGenNum)
    newpass = generatePassword(passLen)
    If Not objDict.Exists(newpass) Then
           objDict.Add newpass, "Unique Password"
        passList = passList & newpass & vbCrLf
    End If 
Loop

'Now save it all to a text file.
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.CreateTextFile ("PasswordList.txt", ForWriting)
ts.write passList
MsgBox "Passwords saved to PasswordList.txt",,"Passwords Generated"
set ts = nothing
set fso = nothing



Function generatePassword(PASSWORD_LENGTH)

Dim NUMLOWER, NUMUPPER, LOWERBOUND, UPPERBOUND, LOWERBOUND1, UPPERBOUND1, SYMLOWER, SYMUPPER
Dim newPassword, count, pwd 
Dim pCheckComplex, pCheckComplexUp, pCheckComplexLow, pCheckComplexNum, pCheckComplexSym, pCheckAnswer


 NUMLOWER    = 48  ' 48 = 0
 NUMUPPER    = 57  ' 57 = 9
 LOWERBOUND  = 65  ' 65 = A
 UPPERBOUND  = 90  ' 90 = Z
 LOWERBOUND1 = 97  ' 97 = a
 UPPERBOUND1 = 122 ' 122 = z
 SYMLOWER    = 33  ' 33 = !
 SYMUPPER    = 46  ' 46 = .
 pCheckComplexUp  = 0 ' used later to check number of character types in password
 pCheckComplexLow = 0 ' used later to check number of character types in password
 pCheckComplexNum = 0 ' used later to check number of character types in password
 pCheckComplexSym = 0 ' used later to check number of character types in password


 ' initialize the random number generator
 Randomize()

 newPassword = ""
 count = 0
 DO UNTIL count = PASSWORD_LENGTH
   ' generate a num between 2 and 10 

 ' if num <= 2 create a symbol 
   If Int( ( 10 - 2 + 1 ) * Rnd + 2 ) <= 2 Then
    pwd = Int( ( SYMUPPER - SYMLOWER + 1 ) * Rnd + SYMLOWER )

   ' if num is between 3 and 5 create a lowercase
   Elseif Int( ( 10 - 2 + 1 ) * Rnd + 2 ) > 2 And  Int( ( 10 - 2 + 1 ) * Rnd + 2 ) <= 5 Then
    pwd = Int( ( UPPERBOUND1 - LOWERBOUND1 + 1 ) * Rnd + LOWERBOUND1 )

    ' if num is 6 or 7 generate an uppercase
   Elseif Int( ( 10 - 2 + 1 ) * Rnd + 2 ) > 5 And  Int( ( 10 - 2 + 1 ) * Rnd + 2 ) <= 7 Then
    pwd = Int( ( UPPERBOUND - LOWERBOUND + 1 ) * Rnd + LOWERBOUND ) 

   Else
       pwd = Int( ( NUMUPPER - NUMLOWER + 1 ) * Rnd + NUMLOWER )
   End If

  newPassword = newPassword + Chr( pwd )

  count = count + 1

  'Check to make sure that a proper mix of characters has been created.  If not discard the password.
  If count = (PASSWORD_LENGTH) Then
      For pCheckComplex = 1 To PASSWORD_LENGTH
          'Check for uppercase
          If Asc(Mid(newPassword,pCheckComplex,1)) >64 And Asc(Mid(newPassword,pCheckComplex,1))< 90 Then
                  pCheckComplexUp = 1 
          'Check for lowercase
          ElseIf Asc(Mid(newPassword,pCheckComplex,1)) >96 And Asc(Mid(newPassword,pCheckComplex,1))< 123 Then
                  pCheckComplexLow = 1 
          'Check for numbers
          ElseIf Asc(Mid(newPassword,pCheckComplex,1)) >47 And Asc(Mid(newPassword,pCheckComplex,1))< 58 Then
                  pCheckComplexNum = 1
          'Check for symbols
          ElseIf Asc(Mid(newPassword,pCheckComplex,1)) >32 And Asc(Mid(newPassword,pCheckComplex,1))< 47 Then
                  pCheckComplexSym = 1
          End If
      Next

      'Add up the number of character sets.  We require 3 or 4 for a complex password.
      pCheckAnswer = pCheckComplexUp+pCheckComplexLow+pCheckComplexNum+pCheckComplexSym

      If pCheckAnswer < 3 Then
          newPassword = ""
          count = 0
      End If
  End If
 Loop
'The password is good so return it
 generatePassword = newPassword
End Function

相关内容