Share via


Procédure pas à pas : validation de la complexité des mots de passe (Visual Basic)

Cette méthode vérifie certaines caractéristiques du mot de passe fort et met à jour un paramètre de chaîne avec les informations sur les vérifications non concluantes.

Les mots de passe peuvent être utilisés dans un système sécurisé pour autoriser un utilisateur. Toutefois, ils doivent être difficiles à deviner par les utilisateurs non autorisés. Des intrus peuvent utiliser un programme d'attaque de dictionnaire, qui itère au sein de tous les mots d'un dictionnaire (ou de plusieurs dictionnaires dans différentes langues) et teste si les mots correspondent au mot de passe d'un utilisateur. Les mots de passe faibles tels que « Yankees » ou « Mustang » peuvent être devinés rapidement. En revanche, les mots de passe plus forts, par exemple « ?You'L1N3vaFiNdMeyeP @ sSWerd! », sont moins faciles à deviner. Un système protégé par mot de passe doit veiller à ce que les utilisateurs choisissent des mots de passe forts.

Un mot de passe fort est complexe (associe des lettres en majuscules et en minuscules, des nombres et des caractères spéciaux) et n'est pas un mot. Cet exemple montre comment vérifier la complexité.

Exemple

Code

''' <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

Compilation du code

Appelez cette méthode en passant la chaîne qui contient ce mot de passe.

Cet exemple nécessite les éléments suivants :

Sécurité

Si vous déplacez le mot de passe sur un réseau, vous devez utiliser une méthode sécurisée pour transférer des données. Pour plus d'informations, consultez Sécurité des applications Web ASP.NET.

Vous pouvez améliorer l'exactitude de la fonction ValidatePassword en ajoutant des contrôles de complexité supplémentaires :

  • Comparez le mot de passe et ses sous-chaînes au nom de l'utilisateur, à l'identificateur de l'utilisateur et à un dictionnaire défini par l'application. En outre, considérez les caractères visuellement semblables comme équivalents lorsque vous effectuez des comparaisons. Par exemple, considérez les lettres « l » et « e » comme équivalentes aux chiffres « 1 » et « 3 ».

  • S'il n'existe qu'un seul caractère en majuscule, vérifiez qu'il ne correspond pas au premier caractère du mot de passe.

  • Assurez-vous que les deux derniers caractères du mot de passe sont des lettres.

  • N'autorisez pas les mots de passe dans lesquels tous les symboles sont saisis à partir de la ligne supérieure du clavier.

Voir aussi

Référence

Regex

Autres ressources

Sécurité des applications Web ASP.NET