CHAINE de CARACTERES - MultiCritères de test ?

Bonjour à tous,

Après de nombreuses lectures et recherches sur le forum, j'ai pu apprendre pas mal de choses mais je me confronte à un probleme que je ne sais pas résoudre votre aide est nécessaire et précieuse

Voila, je souhaite gérer les mots de passe des comptes utilisateurs (parfois une personne peut avoir plusieurs comptes...) de l'entreprise pour laquelle je travaille. il y a environ 3000 comptes avec mots de passe associés.

Je souhaite pour des raisons de sécurité que les mots de passe respectent les règles suivantes:

  • minimum 8 caractères
  • minimum 3 des 4 catégories de caractères : Majuscule, Minuscule, Chiffre, caractère spécial <==== c'est évidemment là que c'est dur

aussi, il me faut tester les 3000 mots de passe existants pour savoir s'ils répondent ou non aux règles. Je ne me vois pas le faire 1 à 1 et je souhaite donc automatiser le test.

Pourriez-vous m'aider, m'aiguiller, ne pas m'envoyer balader ???

Merci par avance de votre aide

Bonjour,

Supposons donc que tu récupères la liste des mots de passe sur une feuille Excel en colonne A, A1 contenant un intitulé d'en-tête (les autres colonnes étant vides).

Function ValidPW(pw As String) As Boolean
    Dim pwvalid(3) As Integer, i%, k%
    If Len(pw) < 8 Then
        ValidPW = False
    Else
        For i = 1 To Len(pw)
            k = Asc(Mid(pw, i, 1))
            Select Case k
                Case 48 To 57
                    pwvalid(0) = 1
                Case 65 To 90, 138, 140, 142, 159, 192 To 214, 216 To 221
                    pwvalid(1) = 2
                Case 97 To 122, 154, 156, 158, 222 To 246, 248 To 255
                    pwvalid(2) = 4
                Case Else
                    pwvalid(3) = 8
            End Select
        Next i
        Select Case WorksheetFunction.Sum(pwvalid)
            Case 7, 11, 13 To 15: ValidPW = True
            Case Else: ValidPW = False
        End Select
    End If
End Function

Sub TestValidPW()
    Dim aa, i%
    aa = ActiveSheet.Range("A1").CurrentRegion
    aa(1, 1) = "Validité"
    For i = 2 To UBound(aa)
        aa(i, 1) = IIf(ValidPW(aa(i, 1)), "Oui", "Non")
    Next i
    ActiveSheet.Range("B1").Resize(UBound(aa)).Value = aa
End Sub

Le code ci-dessus, à placer dans un Module Standard et la proc. TestValidPW à lancer, la feuille de mots de passe étant active.

Elle inscrira Oui ou Non selon que le mot de passe est valide ou non selon tes critères.

Si toutefois tu mettais d'autres éléments dans ta feuille et que la colonne mot de passe ne soit pas en A, il conviendrait d'isoler cette colonne de façon qu'elle soit encadrée par deux colonnes vides, et de modifier dans le code de la macro A1 par la colonne où se trouvent les mots de passe, par exemple F1, et B1 par la colonne voisine de la précédente, soit G1...

Remarque : la fonction vérifiant la validité n'exclut aucun caractère de la table ANSI, il s'ensuit que l'espace (caract. 32) de même que les caractères non visibles ou non imprimables demeurent des caractères valides... y compris les caract. antérieurs à 32, dits caractères de contrôle, qui ont toutefois assez peu de probabilité de se trouver dans un mot de passe !

Cordialement.

Cher MFerrand,

Je tiens à te dire ô combien je te suis reconnaissant pour le temps que tu as pris et pour ce partage de connaissances qui t'honore

Je testerai tout à l'heure sur un fichier maison et te ferai un retour.

Puis test grandeur nature dès lundi.

Une fois encore, un grand merci à toi

Bon week-end

Bien cordialement

Stef.

boujour

un essai à la tulipe

13stef2005.xlsx (8.50 Ko)

cordialement

Wawww franchement je suis gâté par tant d'aide !

Merci Tulipe pour cette façon intéressante et différente de tester les valeurs de l'expression.

Un grand merci à toi également pour ce partage !

J'en apprends encore +

Bon week-end à toi

Stef.

@MFerrand

Test effectué. Malheureusement ca plante lorsque je lance le TestValidPW en m'indiquant le message suivant : "Type d'argument Byref Incompatible"

Est-ce possible de m'intégrer le code correct dans mon fichier test joint ?

15testmdp.xlsx (25.83 Ko)

Merci bcp par avance

De ma faute ! J'aurais dû le prévoir !

Rajouter simplement ByVal dans la déclaration de l'argument de la fonction.

Function ValidPW(ByVal pw As String) As Boolean

Explication (au cas tu en ressentirais le besoin) :

L'argument pw est déclaré de type String, et sans autre mention l'argument sera par défaut passé ByRef (par référence).

Dans ce cas, lorsqu'on appelle la fonction, si l'argument est passé au moyen d'une variable, celle-ci doit être exactement du même type que l'argument pour pouvoir être passée ByRef, sinon il doit être passé ByVal (par valeur).

Or ici, on passe l'argument avec aa(i, 1), élément de tableau de type Variant qui contient une donnée String mais qui n'est manifestement pas du type requis. Et VBA couine !

Sache que chaque fois que cette erreur te survient sur un code, il concerne l'appel d'une autre procédure Sub ou Function, et tu règles toujours le problème en remontant à la procédure appelée pour flanquer un ByVal devant l'argument dont le passage ByRef est rejeté.

Cordialement.

Merci beaucoup pour ce retour rapide et toutes ces précisions

Je testerai donc et reviendrai pour te confirmer que tout fonctionne 👍

Encore un grand merci et une bonne soirée

Stefane.

Cher MFerrand et chere Tulipe

Un grand merci à vous

J'ai testé les 2 formules avec succès.

Je privilégie celle de MFerrand qui répond parfaitement à mon besoin et qui est plus simple pour ce qui me concerne à mettre en place.

J'ai fortement apprécié ce partage de savoir !

Merci encore et longue vie à ce forum d’entraide

Cher @MFerrand et chere @Tulipe,

Je déterre un topic de plusieurs mois auquel vous aviez répondu avec brio

je souhaiterais savoir pourquoi je suis limité à un test d'environ 32.000 mots de passe ?

En effet, je souhaiterais en tester bien plus en 1 passe.

Merci pour votre retour

Bien Cordialement

Stef.

Bonjour Stef,

tu a écrit :

je souhaiterais savoir pourquoi je suis limité à un test d'environ 32.000 mots de passe ?

plage d'une variable de type Integer : -32 768 à 32 767

dans le code VBA de MFerrand (salut) : Dim pwvalid(3) As Integer

mets à la place : Dim pwvalid(3) As Long et ça devrait être ok !

plage d'une variable de type Long : -2 147 483 648 à 2 147 483 647

la mauvaise nouvelle est qu'si un jour tu as plus de 2 147 483 647 mots de passe, y'ait pas d'solution ! quoique y'a aussi le type Double, utilisé d'habitude pour des nombres avec décimales : jusqu'à 1,79769313486231 exposant 308 pour les nombres positifs, et rien ne t'empêche d'utiliser uniquement les nombres entiers (qui peut le plus peut le moins !) ; note quand même que si t'as un seul mot de passe pour chacun des 60 millions de consommateurs français, le type Long pourra suffire !

j'ai pas regardé le code VBA de tulipe_4, mais j'subodore que c'est probablement l'même genre de chose ; tu crois qu'j'peux faire le pari à un contre 32 767 ?

dhany

Waw je tente ca !!!

Un grand merci à toi dhany

Argh

Malheureusement ni Long, ni Double a la place d'Integer ne permettent d'aller plus loin que 32000 caracteres...

[quote="dans ton post d'hier à 19:11, tu"]je souhaiterais savoir pourquoi je suis limité à un test d'environ 32.000 mots de passe ?[/quote]

cela concerne donc le nombre de mots de passe.

désolé, j'avais lu trop vite le code VBA de MFerrand ; tu peux remettre comme c'était avant : Dim pwvalid(3) As Integer ; mais c'est sans doute à un autre endroit du code VBA qu'il faut changer un type Integer en Long.


[quote="dans ton post de 11:32, tu"]Malheureusement ni Long, ni Double à la place d'Integer ne permettent d'aller plus loin que 32.000 caractères...[/quote]

cela ne concerne donc plus le nombre de mots de passe mais le nombre de caractères d'une chaîne.

dans ce cas, il s'agit d'autre chose ; la cause du blocage est alors très subtile : des chaînes de caractères stockées dans un tableau de type Variant ne peuvent pas dépasser 32 767 caractères ; il faut que le tableau soit typé explicitement ainsi :

Dim Tbl(3000) As String ou Dim Tbl$(3000) ; tu peux bien sûr mettre aussi une variante telle que :

Dim Tbl(1 To 3000) As String ou Dim Tbl$(1 To 3000) (borne inférieure explicite)

rappel : avec une borne inférieure explicite, ça devient indépendant d'une éventuelle instruction Option Base 0 ou Option Base 1 car si ça s'avère utile, on peut très bien mettre : Dim Tbl$(5 To 100)

dhany

Réponse apportée nickel. Un énorme merci Dhany !

Du grand art ! et une super disponibilité

Chapeau bas !

merci pour ton retour ! bonne continuation !

dhany

Rechercher des sujets similaires à "chaine caracteres multicriteres test"