Saltar al contenido

Generador de contraseñas de Visual Basic

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úscula O. Usuarios será confunde estos con 0 y 1, así que elimínelos o el 0 y 1 (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 el Enum 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 del List(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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *