Tutorial: Validar la complejidad de las contraseñas (Visual Basic)
Este método comprueba si hay algunas características de contraseña segura y actualiza un parámetro de cadena con información sobre qué comprobaciones de contraseña no se pueden comprobar.
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 para 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 "..." o "Mustang", se pueden adivinar rápidamente. Contraseñas más seguras, como "? Es mucho menos probable que se pueda L1N3vaFiNdMeyeP@sSWerd adivinar. 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 caracteres en mayúsculas, minúsculas, numéricos y 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
Compilar el código
Llame a este método pasando la cadena que contiene esa contraseña.
Para este ejemplo se necesita:
- Acceso a los miembros del espacio de nombres System.Text.RegularExpressions. Agregue una instrucción
Importssi no hay nombres de miembros completos en el código. Para obtener más información, consulte Instrucción Imports (Tipo y espacio de nombres de .NET).
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, vea ASP.NET Web Application Security.
Puede mejorar la precisión de la función ValidatePassword 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 los 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 introducen todos los símbolos desde la fila superior del teclado.