Question 205

Comment générer un mot de passe en VB ?

Il est parfois utile de pouvoir générer automatiquement et de façon aléatoire un mot de passe, par exemple pour attribuer un mot de passe par défaut pour le nouvel utilisateur d'une application à accès sécurisé.

Cet article propose une fonction permettant de générer des mots de passe aléatoires, pouvant respecter des contraintes :

  • type de caractères (alphabétiques, numériques ou caractères spéciaux)
  • nombre de caractère de chaque type (minimum, maximum)
  • complexité (majuscules ou minuscules seules, mélange)

Cette fonction permet aussi de limiter les caractères autorisés. Par exemple, l'implémentation donnée ici n'utilise pas le caractère alphabétique "O" car il est aisément confondu avec le chiffre 0 (zéro). On peut si besoin est augmenter ou limiter ces contraintes. Par exemple, on pourrait exclure le "l" et le "1" donc l'écriture est voisine et donc source potentielle d'erreur de lecture.

Private Enum PwdCaseType
    pwdUPPER = 1
    pwdLOWER = 2
    pwdMIXED = 3
End Enum

Private Function GeneratePassword(ByVal minAlpha As Long, _
                                 ByVal maxAlpha As Long, _
                                 ByVal alphaCase As PwdCaseType, _
                                 ByVal minDigit As Long, _
                                 ByVal maxDigit As Long, _
                                 ByVal minOther As Long, _
                                 ByVal maxOther As Long) As String
    Dim alpha   As String
    Dim digit   As String
    Dim other   As String
    Dim i       As Long
    Dim pwd     As String
    
    Dim alphas  As String
    Dim digits  As String
    Dim others  As String
    
    Dim a       As Long
    Dim b       As Long
    Dim l       As Long
    Dim tmp     As String
    
    Const MAX_PERMUT As Long = 100
    
    alphas = "ABCDEFGHIJKLMNPQRSTUVWXYZ"    ' exclude O
    digits = "123456789"                    ' exclude zero
    others = "&@#§()$%_[]"
    
    Randomize Timer
    
    For i = 1 To minAlpha + Int(Rnd * (maxAlpha - minAlpha + 1))
        alpha = alpha & Mid$(alphas, 1 + Int(Rnd * Len(alphas)), 1)
    Next i
    
    If alphaCase = pwdLOWER Then
        alpha = LCase(alpha)
    ElseIf alphaCase = pwdMIXED Then
        For i = 1 To Len(alpha) Step 2
            Mid$(alpha, i, 1) = LCase(Mid$(alpha, i, 1))
        Next i
    End If
    
    ' generate digit if any
    For i = 1 To minDigit + Int(Rnd * (maxDigit - minDigit + 1))
        digit = digit & Mid$(digits, 1 + Int(Rnd * Len(digits)), 1)
    Next i

    ' generate others if any
    For i = 1 To minOther + Int(Rnd * (maxOther - minOther + 1))
        other = other & Mid$(others, 1 + Int(Rnd * Len(others)), 1)
    Next i
    
    pwd = alpha & digit & other
    
    ' scramble
    l = Len(pwd)
    For i = 1 To MAX_PERMUT
        a = 1 + Int(Rnd * l)
        b = 1 + Int(Rnd * l)
        tmp = Mid$(pwd, a, 1)
        Mid$(pwd, a, 1) = Mid$(pwd, b, 1)
        Mid$(pwd, b, 1) = tmp
    Next i
    
    GeneratePassword = pwd

End Function

L'utilisation de cette fonction est très simple. On l'appelle en spécifiant le nombre minimum et maximum de caractères de chaque type (alphabétique, numérique et autres) et on précise le type (majuscules uniquement, minuscules uniquement ou mélange).


    Dim pwd As String

    ' longueur 12, avec exactement 10 caractères alphabétiques majuscules, deux chiffres et rien d'autre
    pwd = GeneratePassword(10, 10, pwdUPPER, 2, 2, 0, 0)

    ' longueur entre 5 et 15, avec au moins 2 caractères alphabétiques, deux chiffres et 1 caractère spécial
    pwd = GeneratePassword(2, 10, pwdMIXED, 2, 3, 1, 2)

L'intérêt d'un mot de passe généré par un tel système est que de part sa nature parfaitement aléatoire, le mot de passe généré ne sera pas sensible aux attaques dites "par dictionnaire". Avec des longueurs suffisantes, de tels mots de passe sont considérés comme sur.

Le générateur aléatoire de VB n'est pas stricto-sensu aléatoire, au sens cryptographique du terme. Pour obtenir un aléa de qualité cryptographique, on utilisera de préférence les fonctions dédiées de l'API Windows : CryptGenRandom et CryptGenKey. On pourra aussi utiliser les équivalents de CAPICOM. Voir section "Pour aller plus loin" pour plus de détails.

Exemples de mots de passe générés par l'appel suivant :

pwd = GeneratePassword(5, 8, pwdUPPER, 2, 4, 1, 2)

LP65H8$T2YB#KJ6&8PERIVBG[PM)2J13E
M3]85WUE1FJ9X6M&XBCLA&2FNR3BZE]2W
S5A[31VY#EVFN5XUG1(4SNH1UVU3
Pour aller plus loin

Voir aussi :

Date de publication : 24 janvier 2009
Dernière modification : 24 janvier 2009
Rubriques : Algorithmique, Divers, Généralités
Mots-clés : générer, génération, aléa, aléatoire, aléatoirement, random, hasard, mot de passe, mdp, mot, passe, password, pwd, automatiquement, automatique