Random Password Generator, reloaded!

Gioxx  —  07/07/2011 — 5 Comments

Era il 2 febbraio del 2009 quando per la prima volta è comparso un articolo riguardante un servizio tanto “stupido” quanto utile allo stesso tempo.

A due anni di distanza dalla sua prima versione (più che stabile, visto il lavoro che doveva svolgere), oggi vi presento una seconda versione che va incontro ad alcune richieste ricevute nel frattempo (grazie Marco, grazie Paolo, ndr): 9 caratteri, un ciclo in grado di mischiare meglio le lettere e i numeri disponibili, la possibilità di copiare e incollare la password priva di spazio finale (un piccolo bug che c’era nella precedente versione, almeno via Firefox e Chrome).

L’indirizzo è rimasto lo stesso:

services.gxware.org/passwd

nonostante lo script che sta alla base della pagina sia cambiato diventando decisamente più ristretto (script originale: TotallyPHP):

<?php
 function createRandomPassword($len) {
 if (!isset($len)) { $len = 9; };
 $chars = &amp;amp;amp;amp;quot;abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;amp;amp;amp;quot;;
 $charsLen = (strlen($chars)-1);
 srand((double)microtime()*1000000);
 $i = 0;
 $pass = '' ;
 while ( $i &amp;amp;amp;amp;lt; $len ) {
 $num = rand() % $charsLen;
 $tmp = substr($chars, $num, 1);
 $pass = $pass . $tmp;
 $i++;
 }
 return $pass;
}
$password = createRandomPassword();
echo $password; ?>

La seconda delle 3 novità consiste nel fatto che –se necessariopotrete scaricare una differente versione del tool anche in locale, uno script in Visual Basic che vi permetterà –una volta avviato– di scegliere il numero di password da generare e salvarle in un file di testo, una per ciascuna riga così da poter rapidamente copiare ed incollare ciò che vi serve. Il codice è stato realizzato e pubblicato su Tek-Tips.com, ed è disponibile all’indirizzo:

public.gfsolone.com/tools/passwd/randomPasswd.vbs

Per scaricarlo cliccate con il tasto destro sul collegamento e salvatelo in locale sul vostro PC (Salve destinazione come …)

'==========================================================================
'
' 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 &amp;amp;amp;amp;quot;Complex&amp;amp;amp;amp;quot; 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 = 9

'Give inFlag (input Flag) an initial value to ensure we run once
inFlag = &amp;amp;amp;amp;quot;Seed&amp;amp;amp;amp;quot;

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

'Quit if no entry
If pGenNum = &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot; Then WScript.Quit

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

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

'Now save it all to a text file.
Set fso = CreateObject(&amp;amp;amp;amp;quot;Scripting.FileSystemObject&amp;amp;amp;amp;quot;)
Set ts = fso.CreateTextFile (&amp;amp;amp;amp;quot;PasswordList.txt&amp;amp;amp;amp;quot;, ForWriting)
ts.write passList
MsgBox &amp;amp;amp;amp;quot;Passwords saved to PasswordList.txt&amp;amp;amp;amp;quot;,,&amp;amp;amp;amp;quot;Passwords Generated&amp;amp;amp;amp;quot;
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 = &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;
count = 0
DO UNTIL count = PASSWORD_LENGTH
' generate a num between 2 and 10

' if num &amp;amp;amp;amp;lt;= 2 create a symbol
If Int( ( 10 - 2 + 1 ) * Rnd + 2 ) &amp;amp;amp;amp;lt;= 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 ) &amp;amp;amp;amp;gt; 2 And  Int( ( 10 - 2 + 1 ) * Rnd + 2 ) &amp;amp;amp;amp;lt;= 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 ) &amp;amp;amp;amp;gt; 5 And  Int( ( 10 - 2 + 1 ) * Rnd + 2 ) &amp;amp;amp;amp;lt;= 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)) &amp;amp;amp;amp;gt;64 And Asc(Mid(newPassword,pCheckComplex,1))&amp;amp;amp;amp;lt; 90 Then
pCheckComplexUp = 1
'Check for lowercase
ElseIf Asc(Mid(newPassword,pCheckComplex,1)) &amp;amp;amp;amp;gt;96 And Asc(Mid(newPassword,pCheckComplex,1))&amp;amp;amp;amp;lt; 123 Then
pCheckComplexLow = 1
'Check for numbers
ElseIf Asc(Mid(newPassword,pCheckComplex,1)) &amp;amp;amp;amp;gt;47 And Asc(Mid(newPassword,pCheckComplex,1))&amp;amp;amp;amp;lt; 58 Then
pCheckComplexNum = 1
'Check for symbols
ElseIf Asc(Mid(newPassword,pCheckComplex,1)) &amp;amp;amp;amp;gt;32 And Asc(Mid(newPassword,pCheckComplex,1))&amp;amp;amp;amp;lt; 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 &amp;amp;amp;amp;lt; 3 Then
newPassword = &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;
count = 0
End If
End If
Loop
'The password is good so return it
generatePassword = newPassword
End Function

Ultima novità è l’integrazione del Random Password Generator all’interno degli strumenti “mobili” del Network GxWare, da poco trasferiti sotto il nuovo dominio network.gxware.org/iphone:

network.gxware.org/iphone/passwd.php

Questo vi permetterà di generare rapidamente password sufficientemente complesse avendo a portata di mano solo il vostro telefono ed una connessione a internet.

Per chi volesse invece continuare ad usare la prima versione, ho lasciato la possibilità di accedere alla precedente pagina iniziale semplicemente puntando il browser a services.gxware.org/passwd/v1.php.

Buon lavoro! :-)

UPDATE
Grazie al suggerimento dell’utente “caccolangrifata lo script è stato modificato includendo l’utilizzo di lettere maiuscole (oltre che minuscole, come di default) e la possibilità di specificare una differente quota caratteri della password. La modifica è stata operata sia sulla pagina del servizio standard che quella mobile! :-)
×

Attenzione

Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)

Condividi l'articolo con i tuoi contatti: