Excel. Generatore di password causali

Dopo molto tempo, torno a scrivere qualcosa su questo blog, l'argomento è più che altro il soddisfacimento di una curiosità intellettuale. Stavo cercando di distribuire una piccola applicazione Access ad un numero finito di utenti, e pensavo di tenere sotto controllo gli accessi con la semplice attribuzione di una password predeterminata e non modificabile.
Invece di inventarmi password astruse, ho chiesto aiuto ad Excel per generarne alcune in automatico.
E già che c'ero (l'appetito vien mangiando) ho pensato di creare una funzione più generica :)
Googlando (sono vecchio ma mi devo abituare ai neologismi!) ho trovato un articolo datato ma interessante, da cui ho preso spunto, adattandolo alle mie esigenze, cercando di ottimizzarlo un pochino.
Non me ne voglia l'autore, e infatti pubblico subito il link originale :) Ecco: http://simone.cabrino.it/blog/creare-password-con-excel/

Partendo da qui ne è uscito un pezzo di codice da copiare in un Modulo di Excel.

Option Explicit 
'Ispirazione tratta da http://simone.cabrino.it/blog/creare-password-con-excel/

'2000 password di lunghezza 10: 12-13 secondi con la soluzione originale
'2000 password di lunghezza 10: tre-cinque decimi di secondo con la soluzione
'proposta

'by Franz, 2011

'sfrutto un array di password in cui verifico, con un piccolo trucco, l'esistenza
'della password generata

'compilo solo in ultimo il foglio Excel risparmiando tempo di esecuzione
'ottimizzo le funzioni ed elimino le variabili globali
'(codice da inserire in un Modulo di Excel)

Sub GeneraPassword()
Dim
arrayChar() As String, arrayPwd() As String, lunghezza As Integer
Dim a As Integer, numeroPassword As Integer, varChar As String, pwd As String
Dim c As Integer
Randomize Timer
Debug.Print "Start --> "; Timer
varChar = "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,0,1,2,3,4 \
5,6,7,8,9"

arrayChar = Split(varChar, ",")
numeroPassword = 2000
ReDim arrayPwd(numeroPassword - 1) As String
lunghezza = 10
[a:a].Clear
For a = 1 To numeroPassword
pwd = genera(arrayChar, lunghezza - 1)
c = controllo(arrayPwd, pwd)
If c > 0 Then
Debug.Print "--> Extract '" & pwd & "' <--"
Debug.Print "Attenzione, controllo fallito. Password '" & pwd;
Debug.Print "' ripetuta (coincide con l'elemento " & c & ")"
[a1] = "#Errore nella generazione delle password"
Exit Sub
Else

arrayPwd(a - 1) = pwd
'solo per debug

'Debug.Print a, pwd

End
If
Next a
For a = 1 To numeroPassword
[a1].Offset(a - 1, 0) = "'" & CStr(arrayPwd(a - 1))
Next
Debug.Print "End --> "; Timer
End
Sub

Private
Function genera(arr, num_cifre)
Dim
b As Integer, k As Integer, numero As Integer, variabile As String
numero = UBound(arr)
For b = 0 To num_cifre
k = Int(Rnd(1) * numero)
variabile = variabile & arr(k)
Next
genera = variabile
End
Function

Private Function controllo(arr, search) As Integer
Dim
found As Boolean
controllo = 0
'un piccolo trucco per cercare una stringa velocemente in un vettore
'di elementi stringa anche non ordinati mediante la funzione Join

found = InStr(1, "" & Join(arr, "") & "", "" & search & "") > 0
If
found Then
'con lo stesso trucco ottengo la posizione dell'elemento cercato nel vettore
'di partenza

controllo = InStr(1, Join(arr, ""), search)
End
If
End
Function
L'idea di base è quella di creare una password casuale, composta da lettere (solo minuscole in questa versione) e numeri, della lunghezza stabilita nel codice, per il numero di volte stabilito nel codice. L'algoritmo è semplice al limite del banale, quindi ciò che si può fare è ottimizzare la velocità di esecuzione (anche se, manipolando stringhe, non è che si possa fare chissà cosa). In ogni caso ho rispettato l'idea originale, ma con un netto guadagno sui tempi.
Tutta la faccenda potrebbe essere parametrizzata, trasformata in Function e magari arricchita di altri parametri, ad esempio per le lettere maiuscole, ma come mio primo esercizio dopo tanta inattività, credo possa bastare :)


p.s. Per formattare il codice ho utilizzato un foglio di stile personalizzato, tratto da CSharpFormatter (http://www.manoli.net/csharpformat/)... ma i passi manuali sono tanti e penso che per scrivere altri post, se ancora succederà, dovrò utilizzare qualcosa come LiveWriter :)... avete consigli diversi?

posted @ martedì 29 novembre 2011 20:38

Print

Comments on this entry:

No comments posted yet.

Your comment:



 (will not be displayed)


 
 
 
Please add 6 and 5 and type the answer here:
 

Live Comment Preview: