Generate random password and insert value in variable

Aleks
Aleks used Ask the Experts™
on
I am using classic ASP/VB
I need to generate a random password, which should include two numbers, two characters (@#$%, etc) and two letters in caps.
And then I need to create a variable and make this variable be equal to the random password.

I have an old script that generates a password but:

1. I am not sure if it meets the requirements above
2. I am not sure how to make a variable hold the password value
Also has to be 8 characters long

Sub StrRandomize(strSeed)
        Dim i, nSeed
        nSeed = CLng(0)
        For i = 1 To Len(strSeed)
                nSeed = nSeed Xor ((256 * ((i - 1) Mod 4) * AscB(Mid(strSeed, i, 1))))
        Next
        'Randomiser
        Randomize nSeed
End Sub
'--GeneratePassword(nLength)
'--Generates friendly passwords for remembering and pronounciation
Function GeneratePassword(nLength)
        Dim i, bMadeConsonant, c, nRnd
		'You may adjust the below constants to include local,
		'eg. scandinavian characters. This way your passwords
		'will not be limited to latin characters.
        Const strDoubleConsonants = "bdfglmnpst"
        Const strConsonants = "bcdfghklmnpqrstv"
        Const strVocal = "aeiou"
        GeneratePassword = ""
        bMadeConsonant = False
        For i = 0 To nLength
                'Get a random number number between 0 and 1
                nRnd = Rnd
                'Simple or double consonant, or a new vocal?
                'Does not start with a double consonant
				'15% or less chance for the next letter being a double consonant
                If GeneratePassword <> "" AND (bMadeConsonant <> True) AND (nRnd < 0.15) Then
                        'double consonant
                        c = Mid(strDoubleConsonants, Int(Len(strDoubleConsonants) * Rnd + 1), 1)
						'response.write int(Len(strDoubleConsonants) * Rnd + 1)
						'response.write "<br>"
                        c = c & c
						i = i + 1
                        bMadeConsonant = True
                Else
						'80% or less chance for the next letter being a consonant,
						'depending on wether the last letter was a consonant or not.
                        If (bMadeConsonant <> True) And (nRnd < 0.95) Then
                                'Simple consonant
                                c = Mid(strConsonants, Int(Len(strConsonants) * Rnd + 1), 1)
                                bMadeConsonant = True
						'5% or more chance for the next letter being a vocal. 100% if last
						'letter was a consonant - theoreticaly speaking...
                        Else
                                'If last one was a consonant, make vocal
                                c = Mid(strVocal,Int(Len(strVocal) * Rnd + 1), 1)
                                bMadeConsonant = False
                        End If
                End If
                'Add letter
                GeneratePassword = GeneratePassword & c
        Next
        'Is the password long enough, or perhaps too long?
        If Len(GeneratePassword) > nLength Then
                GeneratePassword = Left(GeneratePassword, nLength)
        End If
End Function

StrRandomize CStr(Now) & CStr(Rnd)

Open in new window

Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Martin LissOlder than dirt
Most Valuable Expert 2017
Distinguished Expert 2018

Commented:
This is VB6 code so it may need modification. Note that it uses 31 symbols and if you don't want to use them all, delete those you don't want from the SYMBOLS constant and adjust the references to 31 accordingly.
    Const LETTERS As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Const SYMBOLS As String = "~!@#$%^&*()_+-={}|[]\:"";'<>?,./"
    Dim strPassword As String
    Dim intIndex As Integer
    
    Randomize
    
    ' Generate the password string making the 1st character a letter
    strPassword = Mid(LETTERS, Int((26) * Rnd + 1), 1) & "     "
    ' Randomly generate the 2nd through 6th characters.
    ' Second letter
    intIndex = Int((5) * Rnd + 2)
    Do Until Mid$(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left$(strPassword, intIndex - 1) & Mid(LETTERS, Int((26) * Rnd + 1), 1) & Mid$(strPassword, intIndex + 1)
    ' First symbol
    intIndex = Int((5) * Rnd + 2)
    Do Until Mid$(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left$(strPassword, intIndex - 1) & Mid(SYMBOLS, Int((31) * Rnd + 1), 1) & Mid$(strPassword, intIndex + 1)
    Do Until Mid$(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left$(strPassword, intIndex - 1) & Mid(SYMBOLS, Int((31) * Rnd + 1), 1) & Mid$(strPassword, intIndex + 1)
    ' First number
    Do Until Mid$(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left$(strPassword, intIndex - 1) & Int((10) * Rnd) & Mid$(strPassword, intIndex + 1)
    ' Second number
    Do Until Mid$(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left$(strPassword, intIndex - 1) & Int((10) * Rnd) & Mid$(strPassword, intIndex + 1)
    
    MsgBox strPassword

Open in new window

Author

Commented:
I understand "strPassword" is the variable with holding the value ?

I tried displaying the value on the screen with the code below but nothing showed.

<%=strPassword%>

Open in new window

Martin LissOlder than dirt
Most Valuable Expert 2017
Distinguished Expert 2018

Commented:
Yes.
OWASP: Forgery and Phishing

Learn the techniques to avoid forgery and phishing attacks and the types of attacks an application or network may face.

Author

Commented:
I actually get this error:

Microsoft VBScript compilation  error '800a03f3'

Expected '='

/BlueDot/Intranet/Contacts/webaccess_SPadd.asp, line 94
Const LETTERS As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Martin LissOlder than dirt
Most Valuable Expert 2017
Distinguished Expert 2018

Commented:
Try changing lines 1 and 2 to
Const LETTERS  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const SYMBOLS  = "~!@#$%^&*()_+-={}|[]\:"";'<>?,./"

Open in new window

Also and it's not important but I forgot a ' Second symbol comment between lines 22 and 23.
Martin LissOlder than dirt
Most Valuable Expert 2017
Distinguished Expert 2018

Commented:
If the "$" are a problem, remove them.

Author

Commented:
This is what I have and the error is below:

    Const LETTERS  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	Const SYMBOLS  = "~!@#$%^&*()_+-={}|[]\:"";'<>?,./"
    Dim strPassword As String
    Dim intIndex As Integer
    
    Randomize
    
    ' Generate the password string making the 1st character a letter
    strPassword = Mid(LETTERS, Int((26) * Rnd + 1), 1) & "     "
    ' Randomly generate the 2nd through 6th characters.
    ' Second letter
    intIndex = Int((5) * Rnd + 2)
    Do Until Mid$(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left$(strPassword, intIndex - 1) & Mid(LETTERS, Int((26) * Rnd + 1), 1) & Mid$(strPassword, intIndex + 1)
    ' First symbol
    intIndex = Int((5) * Rnd + 2)
    Do Until Mid$(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left$(strPassword, intIndex - 1) & Mid(SYMBOLS, Int((31) * Rnd + 1), 1) & Mid$(strPassword, intIndex + 1)
    Do Until Mid$(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left$(strPassword, intIndex - 1) & Mid(SYMBOLS, Int((31) * Rnd + 1), 1) & Mid$(strPassword, intIndex + 1)
    ' First number
    Do Until Mid$(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left$(strPassword, intIndex - 1) & Int((10) * Rnd) & Mid$(strPassword, intIndex + 1)
    ' Second number
    Do Until Mid$(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left$(strPassword, intIndex - 1) & Int((10) * Rnd) & Mid$(strPassword, intIndex + 1)
    
    MsgBox strPassword

Open in new window


Error:

Microsoft VBScript compilation  error '800a0401'

Expected end of statement

/BlueDot/Intranet/Contacts/webaccess_SPadd.asp, line 96
Dim strPassword As String
----------------^
Martin LissOlder than dirt
Most Valuable Expert 2017
Distinguished Expert 2018

Commented:
Change line 3 and 4 to
    Dim strPassword
    Dim intIndex

Open in new window

Author

Commented:
Microsoft VBScript compilation  error '800a0408'

Invalid character

/BlueDot/Intranet/Contacts/webaccess_SPadd.asp, line 106
Do Until Mid$(strPassword, intIndex, 1) = " "
Martin LissOlder than dirt
Most Valuable Expert 2017
Distinguished Expert 2018

Commented:
As I suggested above, try removing all the the "$". They are in lines 13, 16, 19, 22, 23, 26, 28, 31 and 36.

Author

Commented:
Error on the last line:

Microsoft VBScript runtime  error '800a0046'

Permission denied: 'MsgBox'

Author

Commented:
I removed that line, but the password doesn't show anything. Here is my entire page, you can check it out.

<html>
<head>
<!--#include file="../../includes/bdot/scripts.asp"-->
<meta charset="utf-8">
<title></title>

<script language="vbscript" runat="server">
    Const LETTERS  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	Const SYMBOLS  = "~!@#$%^&*()_+-={}|[]\:"";'<>?,./"
    Dim strPassword
    Dim intIndex
    
    Randomize
    
    ' Generate the password string making the 1st character a letter
    strPassword = Mid(LETTERS, Int((26) * Rnd + 1), 1) & "     "
    ' Randomly generate the 2nd through 6th characters.
    ' Second letter
    intIndex = Int((5) * Rnd + 2)
    Do Until Mid(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left(strPassword, intIndex - 1) & Mid(LETTERS, Int((26) * Rnd + 1), 1) & Mid(strPassword, intIndex + 1)
    ' First symbol
    intIndex = Int((5) * Rnd + 2)
    Do Until Mid(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left(strPassword, intIndex - 1) & Mid(SYMBOLS, Int((31) * Rnd + 1), 1) & Mid(strPassword, intIndex + 1)
    Do Until Mid(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left(strPassword, intIndex - 1) & Mid(SYMBOLS, Int((31) * Rnd + 1), 1) & Mid(strPassword, intIndex + 1)
    ' First number
    Do Until Mid(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left(strPassword, intIndex - 1) & Int((10) * Rnd) & Mid(strPassword, intIndex + 1)
    ' Second number
    Do Until Mid(strPassword, intIndex, 1) = " "
        intIndex = Int((5) * Rnd + 2)
    Loop
    strPassword = Left(strPassword, intIndex - 1) & Int((10) * Rnd) & Mid(strPassword, intIndex + 1)
    
   
</script>
</head>

<body>
<p>password = <%=strPassword%></p>

</body>

Open in new window

Martin LissOlder than dirt
Most Valuable Expert 2017
Distinguished Expert 2018

Commented:
OK, just remove that line and do whatever you want with strPassword.

Author

Commented:
I tried to display it but it shows nothing.
Martin LissOlder than dirt
Most Valuable Expert 2017
Distinguished Expert 2018

Commented:
Please post your code.

Author

Commented:
I did, read above, I posted the whole page.
Martin LissOlder than dirt
Most Valuable Expert 2017
Distinguished Expert 2018

Commented:
I missed that, sorry.

I don't know anything about VBScript but the web shows me things like this to show the contents of a variable.

WScript.Echo strPassword

Try that at line 44 in your code.

Author

Commented:
Microsoft VBScript runtime  error '800a01a8'

Object required: 'WScript'

Author

Commented:
I also noticed the script is missing numbers  :$
It has letters and symbols.
Older than dirt
Most Valuable Expert 2017
Distinguished Expert 2018
Commented:
I'm sorry but because of my lack of VBScript knowledge it looks like you need someone else to help you.

Author

Commented:
Ok ... thanks. Ill post the points and open another ticket.

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial