Tutorial: Validar la complejidad de las contraseñas (Visual Basic)

Este método comprueba las características de contraseña segura y actualizar un parámetro de cadena con información sobre las comprobaciones en las que se produce un error de 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 distintos 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. Es mucho menos probable que se adivinen contraseñas más seguras, como «?¡YouL1N3vaFiNdMeyeP@sSWerd!». 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 verificar 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

Compilar el código

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

Para este ejemplo se necesita:

Seguridad

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

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

  • Compara 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, trata caracteres visualmente similares como equivalentes al realizar las comparaciones. Por ejemplo, trata las letras «l» y «e» como equivalentes a los números «1» y «3».

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

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

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

Consulte también