Discussione:
Generatore password casuali
(troppo vecchio per rispondere)
Pasquy_77
2009-03-25 11:41:45 UTC
Permalink
Salve a tutti,
ho fatto questa semplice funzione per creare delle password in modo
casuale e di complessità differente in base ai parametri specificati.
Funziona abbastanza bene, ma mi chiedevo se qualcuno ne ha una
migliore o se si può rendere la mia un pò più efficace.

------------------------------------------------------------------------------------------------------------------------
Public Function GeneraPassword(Optional Lunghezza As Integer = "8",
Optional Complessita As String = "L9") As String
' Sintassi Complessità, esempio "L9" per pwd con caratteri minuscoli e
numeri
' La password più complessa è ottenuta specificando Complessità = "X9s
+"
' in cui i simboli "!+-*;:" vengono aggiunti 2 volte nella stringa di
insieme
' questo aumenta le probabilità di inserire più simboli nella password
' X --> caratteri Maiuscolo e Minuscolo
' U --> caratteri Maiuscolo
' L --> caratteri Minuscolo
' 9 --> numeri
' s --> segni o simboli
' + --> solo segni
Dim i As Integer, numCar As Integer
Dim strPwd As String, strInsieme As String

Const Minuscole As String = "abcdefghijklmnopqrstuvwxyz"
Const Maiuscole As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const Numeri As String = "0123456789"
Const Segni As String = "!+-*;:"
Const Simboli As String = "!£$%&()=?^[]_<>+-/*;,:."

strInsieme = ""

'Definisco la stringa da dove prendere i caratteri per la password
'unendo gli insiemi specificati nella variabile Complessit‡
If InStr(Complessita, "X") = 0 Then 'Evito di inserire 2 volte
maiuscole e/o minuscole
If InStr(Complessita, "U") > 0 Then strInsieme = strInsieme &
Maiuscole
If InStr(Complessita, "L") > 0 Then strInsieme = strInsieme &
Minuscole
Else
strInsieme = strInsieme & Minuscole & Maiuscole
End If
If InStr(Complessita, "9") > 0 Then strInsieme = strInsieme & Numeri
If InStr(Complessita, "s") > 0 Then strInsieme = strInsieme & Simboli
If InStr(Complessita, "+") > 0 Then strInsieme = strInsieme & Segni

numCar = Len(strInsieme)

'Se Complessità contiene caratteri diversi da "XLU9S+"
If strInsieme = "" Then
strPwd = "Caratteri errati nel valore complessit‡"
Else
For i = 1 To Lunghezza
'Estraggo un carattere a caso dalla stringa di insieme
grazie alla funzione Rnd()
strPwd = strPwd & Mid(strInsieme, Int(Rnd() * numCar + 1),
1)
Next i
End If

GeneraPassword = strPwd

End Function
------------------------------------------------------------------------------------------------------------------------

Il problema di questa mia funzione è che può capitare, ad esempio se
si desidera avere i numeri nella password, che non ne compaia neanche
uno nel risultato finale.
(poco male per me, se la password non piace all'utente preme
nuovamente il pulsante finchè il risultato non lo "aggrata")

Ho visto la seguente funzione sul SitoComune (sezione moduli), ma non
mi piace molto:
5.17 Generazione di una password in maniera casuale

Avete altre idee?

Ringrazio anticipatamente
Pasquy_77
2009-03-27 08:34:03 UTC
Permalink
Post by Pasquy_77
Avete altre idee?
Nessuno mi risponde
:-(
E' perchè la mia funzione è talmente bella che non merita commento
(decisamente improbabile)
oppure è talmente BRUTTA che non merita commento?

Accetto anche insulti, grazie
;-)
Cinzia
2009-03-27 21:22:04 UTC
Permalink
Post by Pasquy_77
Avete altre idee?
Nessuno mi risponde
:-(
E' perchè la mia funzione è talmente bella che non merita commento
(decisamente improbabile)
oppure è talmente BRUTTA che non merita commento?

Accetto anche insulti, grazie
;-)


Ciao Pasqui77,
ecco una versione riveduta della tua che risolve i problemi segnalati,
supponendo che nella password, numeri, simboli o segni siano presenti
se richiesti una sola volta.
Option Compare Database
Const Minuscole As String = "abcdefghijklmnopqrstuvwxyz"
Const Maiuscole As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const Numeri As String = "0123456789"
Const Segni As String = "!+-*;:"
Const Simboli As String = "!£$%&()=?^[]_<>+-/*;,:."

Public Function GeneraPassword(Optional Lunghezza As Integer = "8",
Optional Complessita As String = "L9") As String
' Sintassi Complessità, esempio "L9" per pwd con caratteri minuscoli
eNumeri
' La password più complessa è ottenuta specificando Complessità =
"X9s+"
' in cui i simboli "!+-*;:" vengono aggiunti 2 volte nella stringa di
insieme
' questo aumenta le probabilità di inserire più simboli nella password
' X --> caratteri Maiuscolo e Minuscolo
' U --> caratteri Maiuscolo
' L --> caratteri Minuscolo
' 9 --> numeri
' s --> segni o simboli
' + --> solo segni
Dim i As Integer, numCar As Integer
Dim strPwd As String
Dim strInsieme As String


strInsieme = ""

'Definisco la stringa da dove prendere i caratteri per la password
'unendo gli insiemi specificati nella variabile Complessit?
If InStr(Complessita, "X") = 0 Then 'Evito di inserire 2 volte
maiuscole e/o minuscole
If InStr(Complessita, "U") > 0 Then strInsieme = strInsieme &
Maiuscole
If InStr(Complessita, "L") > 0 Then strInsieme = strInsieme &
Minuscole
Else
strInsieme = strInsieme & Minuscole & Maiuscole
End If
If InStr(Complessita, "9") > 0 Then Lunghezza = Lunghezza - 1
'strInsieme = strInsieme & Numeri
If InStr(Complessita, "s") > 0 Then Lunghezza = Lunghezza - 1
'strInsieme = strInsieme & Simboli
If InStr(Complessita, "+") > 0 Then Lunghezza = Lunghezza - 1
'strInsieme = strInsieme & Segni

numCar = Len(strInsieme)

'Se Complessità contiene caratteri diversi da "XLU9S+"
If strInsieme = "" Then
strPwd = "Caratteri errati nel valore complessit?"
Else
For i = 1 To Lunghezza
'Estraggo un carattere a caso dalla stringa di
insiemegrazie alla funzione Rnd()
strPwd = strPwd & Mid(strInsieme, Int(Rnd() * numCar + 1),
1)
Next i
End If
If InStr(Complessita, "9") > 0 Then
Dim x As Integer
x = Int(Rnd() * Lunghezza + 1)
strPwd = Left(strPwd, x - 1) & Mid$(Numeri, Int(Rnd() * 11) + 1,
1) & Right(strPwd, Len(strPwd) - x + 1)
End If
If InStr(Complessita, "s") > 0 Then

x = Int(Rnd() * Len(strPwd) + 1)
strPwd = Left(strPwd, x - 1) & Mid$(Simboli, Int(Rnd() * 24) + 1,
1) & Right(strPwd, Len(strPwd) - x + 1)
End If
If InStr(Complessita, "+") > 0 Then

x = Int(Rnd() * Len(strPwd) + 1)
strPwd = Left(strPwd, x - 1) & Mid$(Segni, Int(Rnd() * 6) + 1, 1)
& Right(strPwd, Len(strPwd) - x + 1)
End If

GeneraPassword = strPwd

End Function
--
Cinzia [Office Access MVP]
_______________________
www.riolab.org
http://accessdaziacin.spaces.live.com
----------------------------------------
Bruno Campanini
2009-03-28 23:21:46 UTC
Permalink
Post by Pasquy_77
Avete altre idee?
Nessuno mi risponde
:-(
============================================
Io ho fatto così:
- definiti 4 gruppi (GRP) contenenti minuscole, maiuscole,
numeri, segni
- assegno un carattere scelto random da ciascun GRP
(così assicuro l'esistenza di almeno un carattere di ciascun GRP)
- scelgo random uno dei 4 GRP e da questo scelgo random un carattere;
questa operazione per n-4 volte.
- rimescolo le carte.

---------------------------------------------------------------
Private Sub Password_Click()
Dim S As String, PSW As String, L(1 To 4) As Integer
Dim GRP(1 To 4) As String, i As Integer, j
Dim n As Integer, S1 As New Collection, R As Integer

' Unica definizione: lunghezza della PSW
n = 12
'----------------------------------------

GRP(1) = "abcdefghijklmnopqrstuvwxyz"
GRP(2) = UCase(GRP(1))
GRP(3) = "0123456789"
GRP(4) = "\|!£$%/()*><"
For i = 1 To 4
L(i) = Len(GRP(i))
Next

' I primi 4 random
For i = 1 To 4
S = S & Mid(GRP(i), Int(L(i) * Rnd + 1), 1)
Next

' I successivi n-4 (random i GRP e random i caratteri del gruppo)
For i = 1 To n - 4
R = Int(4 * Rnd + 1)
S = S & Mid(GRP(R), Int(L(R) * Rnd + 1), 1)
Next

' Mescola le carte
Do Until S1.Count = n
R = Int(n * Rnd + 1)
On Error Resume Next
S1.Add R, CStr(R)
On Error GoTo 0
Loop
For Each j In S1
PSW = PSW & Mid(S, j, 1)
Next

MsgBox PSW

End Sub
---------------------------------------------------------------

Bruno
Pasquy_77
2009-03-31 14:48:00 UTC
Permalink
Post by Pasquy_77
Post by Pasquy_77
Avete altre idee?
Nessuno mi risponde
:-(
============================================
 - definiti 4 gruppi (GRP) contenenti minuscole, maiuscole,
    numeri, segni
 - assegno un carattere scelto random da ciascun GRP
   (così assicuro l'esistenza di almeno un carattere di ciascun GRP)
- scelgo random uno dei 4 GRP e da questo scelgo random un carattere;
  questa operazione per  n-4  volte.
- rimescolo le carte.
Bruno
Rieccomi, scusate il ritardo...
grazie ad entrambi per i consigli, molto interessanti.
Ho adattato la soluzione di Bruno per renderla flessibile come lo era
la mia in principio, il risultato è questo:

Public Function GeneraPassword(Optional Lunghezza As Integer = "8",
Optional Complessita As String = "L9") As String
' Sintassi Complessit‡, esempio "L9" per pwd con caratteri minuscoli e
numeri
' La password pi˘ complessa Ë ottenuta specificando Complessit‡ = "LU9s
+"
' in cui i simboli "!+-*;:" vengono aggiunti 2 volte nella stringa di
insieme
' U --> carattere Maiuscolo
' L --> carattere Minuscolo
' 9 --> numero
' s --> segno o simbolo
' + --> solo segni
Dim S As String, PSW As String, L(1 To 5) As Integer
Dim GRP(1 To 5) As String, i As Integer, j
Dim n As Integer, S1 As New Collection, R As Integer

n = Lunghezza

'Assegno a x gruppi le relative stringhe
For i = 1 To Len(Complessita)
Select Case Mid(Complessita, i, 1)
Case Is = "L"
GRP(i) = "abcdefghijklmnopqrstuvwxyz"
Case Is = "U"
GRP(i) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Case Is = "9"
GRP(i) = "0123456789"
Case Is = "s"
GRP(i) = "!£$%&()=?^[]_<>+-/*;,:."
Case Is = "+"
GRP(i) = "!+-*;:"
End Select
Next i

'Verifico le lunghezze delle stringhe
For i = 1 To Len(Complessita)
L(i) = Len(GRP(i))
Next

' I primi caratteri random, quindi ho almeno un valore per ogni gruppo
For i = 1 To Len(Complessita)
S = S & Mid(GRP(i), Int(L(i) * Rnd + 1), 1)
Next

'ESISTE LA (REMOTA) POSSIBILITA' DI UN LOOP INFINITO o comunque molto
lungo
' I successivi caratteri random sia i GRP che i caratteri del gruppo
Do Until Len(S) = n
R = Int(Len(Complessita) * Rnd + 1)
S = S & Mid(GRP(R), Int(L(R) * Rnd + 1), 1)
Loop

' Mescola le carte
Do Until S1.Count = n
R = Int(n * Rnd + 1)
On Error Resume Next
S1.Add R, CStr(R)
On Error GoTo 0
Loop
For Each j In S1
PSW = PSW & Mid(S, j, 1)
Next

GeneraPassword = PSW
End Function


Grazie ancora per i consigli, cosi è decisamente migliore!!!
:-)

Continua a leggere su narkive:
Loading...