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

Cette méthode cherche quelques caractéristiques de mot de passe fort et met à jour un paramètre de chaîne avec des informations indiquant les vérifications de mot de passe qui ont échoué.

Les mots de passe peuvent être utilisés dans un système sécurisé pour autoriser un utilisateur. Toutefois, les mots de passe doivent être difficiles à deviner pour les utilisateurs non autorisés. Les attaquants peuvent utiliser un programme d’attaque de dictionnaire, qui itère tous les mots d’un dictionnaire (ou plusieurs dictionnaires dans différentes langues) et vérifie si l’un des mots fonctionne comme mot de passe pour un utilisateur. Les mots de passe faibles tels que « Yankees » ou « Mustang » peuvent être rapidement devinés. Des mots de passe plus forts, tels que « ?You’L1N3vaFiNdMeyeP@sSWerd! », sont beaucoup moins susceptibles d’être devinés. Un système protégé par mot de passe doit s’assurer que les utilisateurs choisissent des mots de passe forts.

Un mot de passe fort est complexe (contenant un mélange de caractères majuscules, minuscules, numériques et 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

Compiler le code

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

Cet exemple nécessite :

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 la précision de la fonction ValidatePassword en ajoutant des vérifications de complexité supplémentaires :

  • Comparez le mot de passe et ses sous-chaînes avec le nom de l’utilisateur, l’identificateur d’utilisateur et un dictionnaire défini par l’application. Traitez aussi des caractères visuellement similaires comme équivalents lors de l’exécution des comparaisons. Par exemple, traitez les lettres « l » et « e » comme équivalentes aux chiffres « 1 » et « 3 ».

  • S’il n’y a qu’un seul caractère majuscule, vérifiez qu’il ne s’agit pas du 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