Posterior a indagar en diversos repositorios y sitios finalmente hallamos la solución que te mostraremos aquí.
Solución:
Esto no depende de los controles de la interfaz de usuario ni utiliza las funciones heredadas anteriores a NET VB. En cambio, las variables se pasan al generador para que sea independiente de la interfaz de usuario. Tampoco usa As Object
porque las cuerdas son cuerdas.
Private Enum PasswordParts
Upper = 1
Lower = 2
Numerals = 4
All = 7
End Enum
Private Shared RNG As New Random()
Private Shared Numerals As String = "0123456789"
Private Shared Upper As String = "ABCDEFGHIJKLMNPQRSTUVWXYZYZ"
Private Shared Lower As String = "abcdefghijkmnopqrstuvwxyzyz"
Private Function GeneratePassword(length As Int32,
Optional pwparts As PasswordParts = PasswordParts.All) As String
Dim PWCharPool As String = ""
Dim PW As New List(Of String)()
' check the requested length
If length < 6 Then length = 6
If length > 20 Then length = 20
' build the pool and add the first of required characters
' for assure minimum conformance
If pwparts.HasFlag(PasswordParts.Lower) Then
PW.Add(Lower(RNG.Next(0, Lower.Length)))
PWCharPool &= Lower
End If
If pwparts.HasFlag(PasswordParts.Upper) Then
PW.Add(Upper(RNG.Next(0, Upper.Length)))
PWCharPool &= Upper
End If
If pwparts.HasFlag(PasswordParts.Numerals) Then
PW.Add(Numerals(RNG.Next(0, Numerals.Length)))
PWCharPool &= Numerals
End If
' pick the rest of the elements
For n As Int32 = PW.Count To length - 1
PW.Add(PWCharPool(RNG.Next(0, PWCharPool.Length)))
Next
' shuffle the result so that the
' first 1-3 chars are not predictable
Shuffle(PW, RNG)
' create a string from the result
Return String.Join("", PW)
End Function
- Tenga en cuenta que no hay minúsculas
L
o mayúsculaO
. Usuarios será confunde estos con0
y1
, así que elimínelos o el0
y1
(o ambos) - Si los requisitos para al menos 1 superior, inferior y numeral son duro, entonces no hay necesidad real de
If
declaraciones (no bloques): elija siempre una de cada lista antes de agregarlas al grupo. Tampoco necesitarías elEnum
o param. Los dejé según el código de la pregunta.- Tenga en cuenta que debe agregar código para manejar cuando hacen clic en No casillas de verificación antes de llamar a este método.
- A
StringBuilder
podría usarse en lugar delList(of String)
, pero las cadenas son tan cortas que realmente no ahorra tiempo hasta que lo ejecuta en un bucle muchas, muchas veces e incluso entonces el tiempo ahorrado es minúsculo.
Probándolo:
Dim enumValues = [Enum].GetValues(GetType(PasswordParts)).Cast(Of Int32)()
For n As Int32 = 1 To 1000
Dim style = CType(enumValues(RNG.Next(0, 4)), PasswordParts)
Dim pwLen = RNG.Next(6, 21)
Dim PW = GeneratePassword(pwLen, style)
' get riled up if the length does not match
Debug.Assert(PW.Length = pwLen)
Console.WriteLine("style: 0 pw: '1' (len=2)", style, PW, PW.Length)
Next
Salida de muestra:
estilo: Pw superior: ‘QFHGPLIEEYPRP’ (len = 13)
estilo: Todo pw: ‘Z9Y3CoW’ (len = 7)
estilo: Pw inferior: ‘tyghanjzudhhorfmvjr’ (len = 19)
estilo: Todo pw: ‘XyY3q10N6S’ (len = 10)
estilo: Pw superior: ‘IOZGTTQTPCYLKGEFRZ’ (len = 18)
estilo: Todo pw: ‘7t5CNMUM0GdWb’ (len = 13)
estilo: Pw superior: ‘YIFXHRKEICOHXEUX’ (len = 16)
Luego, el ayudante para mezclar (que es algo opcional):
' Standared FY shuffle for List(Of T)
Public Sub Shuffle(Of T)(items As List(Of T), rnd As Random)
Dim temp As T
Dim j As Int32
For i As Int32 = items.Count - 1 To 0 Step -1
' Pick an item for position i.
j = rnd.Next(i + 1)
' Swap them.
temp = items(i)
items(i) = items(j)
items(j) = temp
Next i
End Sub
El gran problema es que nadie puede recordar esas contraseñas, por lo que quedan pegadas al monitor o en la parte inferior del teclado. Un método mejor es dejar que el usuario elija el PW y simplemente verificar que se ajusta a las reglas marcando el string eligen por su longitud y contenido. Esto permitiría my~MuffyDoodle123
o algunos que el usuario pueda recordar. Tal vez obligarlos a cambiarlo periódicamente y tal vez agregar un TrashCan
almacenar viejos PW por usuario para que no puedan reutilizar el mismo dentro de 6 o 9 meses.
Una forma de generar automáticamente PW memorables es usar palabras. Cree una lista de varios miles de adjetivos y adverbios y otra lista de algunos miles de sustantivos (más fácil de lo que parece, hay generadores en línea), puede crear combinaciones aliterativas más un carácter especial:
Rancio3Lluvia
Susurro $ Marchito
Cremoso / Algodón
Duradero / Imperio
Máximo7Mist
Grasa / Gloria
Vaporized_Vision
¡Tóxico! Lágrimas
¡Enojado! Ábaco
La parte “difícil” es utilizar una lista centralizada y descartar las palabras a medida que se utilizan para que no pueda haber palabras repetidas en las contraseñas generadas. Solo cuando una de las colas se está agotando, comienza de nuevo.
Puntuaciones y reseñas
Si eres capaz, puedes dejar un post acerca de qué le añadirías a este ensayo.