Compartir a través de


Tutorial: Validación de que las contraseñas son complejas (Visual Basic)

Este método comprueba algunas características de una contraseña segura y actualiza un parámetro de cadena con información sobre en qué comprobaciones falla la contraseña.

Las contraseñas se pueden usar en un sistema seguro para autorizar a un usuario. Sin embargo, las contraseñas deben ser difíciles de adivinar a los usuarios no autorizados. Los atacantes pueden usar un programa de ataque de diccionario , que recorre en iteración todas las palabras de un diccionario (o varios diccionarios en diferentes idiomas) y comprueba si alguna de las palabras funciona como contraseña de un usuario. Las contraseñas débiles como "Yankees" o "Mustang" se pueden adivinar rápidamente. Contraseñas más seguras, como "?You'L1N3vaFiNdMeyeP@sSWerd!", son mucho menos probables que se adivinen. Un sistema protegido con contraseña debe asegurarse de que los usuarios elijan contraseñas seguras.

Una contraseña segura es compleja (que contiene una combinación de mayúsculas, minúsculas, numéricas y caracteres especiales) y no es una palabra. En este ejemplo se muestra cómo comprobar la complejidad.

Ejemplo

Código

''' <summary>Determines if a password is sufficiently complex.</summary>
''' <param name="pwd">Password to validate</param>
''' <param name="minLength">Minimum number of password characters.</param>
''' <param name="numUpper">Minimum number of uppercase characters.</param>
''' <param name="numLower">Minimum number of lowercase characters.</param>
''' <param name="numNumbers">Minimum number of numeric characters.</param>
''' <param name="numSpecial">Minimum number of special characters.</param>
''' <returns>True if the password is sufficiently complex.</returns>
Function ValidatePassword(ByVal pwd As String, 
    Optional ByVal minLength As Integer = 8, 
    Optional ByVal numUpper As Integer = 2, 
    Optional ByVal numLower As Integer = 2, 
    Optional ByVal numNumbers As Integer = 2, 
    Optional ByVal numSpecial As Integer = 2) As Boolean

    ' Replace [A-Z] with \p{Lu}, to allow for Unicode uppercase letters.
    Dim upper As New System.Text.RegularExpressions.Regex("[A-Z]")
    Dim lower As New System.Text.RegularExpressions.Regex("[a-z]")
    Dim number As New System.Text.RegularExpressions.Regex("[0-9]")
    ' Special is "none of the above".
    Dim special As New System.Text.RegularExpressions.Regex("[^a-zA-Z0-9]")

    ' Check the length.
    If Len(pwd) < minLength Then Return False
    ' Check for minimum number of occurrences.
    If upper.Matches(pwd).Count < numUpper Then Return False
    If lower.Matches(pwd).Count < numLower Then Return False
    If number.Matches(pwd).Count < numNumbers Then Return False
    If special.Matches(pwd).Count < numSpecial Then Return False

    ' Passed all checks.
    Return True
End Function

Sub TestValidatePassword()
    Dim password As String = "Password"
    ' Demonstrate that "Password" is not complex.
    MsgBox(password & " is complex: " & ValidatePassword(password))

    password = "Z9f%a>2kQ"
    ' Demonstrate that "Z9f%a>2kQ" is not complex.
    MsgBox(password & " is complex: " & ValidatePassword(password))
End Sub

Compilación del código

Llame a este método pasando la cadena que contiene esa contraseña.

Este ejemplo requiere:

Seguridad

Si va a mover la contraseña a través de una red, debe usar un método seguro para transferir datos. Para obtener más información, consulte ASP.NET Seguridad de aplicaciones web.

Puede mejorar la precisión de la ValidatePassword función agregando comprobaciones de complejidad adicionales:

  • Compare la contraseña y sus subcadenas con el nombre del usuario, el identificador de usuario y un diccionario definido por la aplicación. Además, trate caracteres visualmente similares como equivalentes al realizar las comparaciones. Por ejemplo, trate las letras "l" y "e" como equivalentes a los números "1" y "3".

  • Si solo hay un carácter en mayúsculas, asegúrese de que no sea el primer carácter de la contraseña.

  • Asegúrese de que los dos últimos caracteres de la contraseña son caracteres de letra.

  • No permita contraseñas en las que se escriban todos los símbolos desde la fila superior del teclado.

Consulte también