Tutorial: Validar la complejidad de las contraseñas (Visual Basic)
Este método comprueba algunas características de contraseña segura y actualiza un parámetro de cadena con información sobre qué comprobaciones no supera la contraseña.
Las contraseñas se pueden utilizar en un sistema seguro para autorizar a un usuario. Sin embargo, las contraseñas deben ser difíciles de adivinar para los usuarios no autorizados. Los atacantes pueden utilizar un programa de ataque de diccionario, que recorre en iteración todas las palabras de un diccionario (o varios diccionarios en distintos idiomas) y prueba si alguna de las palabras funciona como contraseña de un usuario. Las contraseñas débiles como "Ferrari" o "Barcelona" se pueden averiguar rápidamente. Hay muchas menos posibilidades de que se adivinen las contraseñas más fuertes, como "?nUnKaseT'8oCurRir@mYcoNtrase_n_a3!". Un sistema protegido mediante contraseña debería garantizar que los usuarios eligen contraseñas seguras.
Una contraseña segura es compleja (contiene una mezcla de mayúsculas, minúsculas, números y caracteres especiales) y no es una palabra. Este ejemplo 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. Agregar una instrucción Imports si no se incluyen nombres de miembro completos en el código. Para obtener más información, vea Instrucción Imports (Tipo y espacio de nombres de .NET).
Seguridad
Si está moviendo la contraseña por una red, necesita utilizar un método seguro para transferir los datos. Para obtener más información, vea Seguridad ASP.NET de aplicaciones Web.
Puede mejorar la exactitud de la función ValidatePassword agregando comprobaciones de complejidad adicionales:
Compare la contraseña y sus subcadenas con respecto al 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, considere las letras "l" y "e" como equivalentes a los números "1" y "3".
Si hay sólo un carácter en mayúscula, asegúrese de que no es el primer carácter de la contraseña.
Asegúrese de que los últimos dos caracteres de la contraseña son caracteres de letra.
No permita contraseñas en las que todos los símbolos se escriben desde la fila superior del teclado.