5/5 (9 avis)
Vue 7 219 fois - Téléchargée 699 fois
function max_tableau(tableau) // retourne la longueur de l'élément le plus long d'un tableau de chaines de caractères { taille = 0; while (tableau.length > 0) { ligne = tableau.pop().length; if (ligne > taille) { taille=ligne; } } return taille; } function dedoublonne(chaine) // élimine les caractères en doublon dans une chaine { tableau = chaine.split('').reverse(); resultat = ''; while (tableau.length > 0) { caractere = tableau.pop(); if (tableau.indexOf(caractere) == -1) { resultat += caractere; } } return resultat; } function securite_mdp(champ_mdp) // calcul le niveau de confiance à accorder à un mot de passe { // Pour que cela fonctionne avec IE 6 ou 7, il faut procéder aux changements suivants : // // majuscule = max_tableau(mdp.split(/[^A-Z]/)); // minuscule = max_tableau(mdp.split(/[^a-z]/)); // lettre = max_tableau(mdp.split(/[^a-zA-Z]/)); // chiffre = max_tableau(mdp.split(/[^0-9]/)); // different = max_tableau(mdp.split(/[^a-zA-Z0-9]/)); // accent = 0; // nonalphanum = different; // // et modifier le calcul du score pour prendre en compte le fait que les accents ne sont pas reconnus. // // On peut savoir si on a affaire à IE avec le test suivant par exemple : // // if ((navigator.appVersion.indexOf('MSIE') != -1) { alert('Internet Explorer'); } // mdp = champ_mdp.value.replace(/^\s*/,'').replace(/\s*$/,''); // suppression des espaces en début et fin longueur = mdp.length; // longueur du mot de passe if (longueur >= 6) // taille minimum du mot de passe = 6 { majuscule = max_tableau(mdp.split(/[^A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜ]/)); // plus grand nombre de lettres majuscules successives minuscule = max_tableau(mdp.split(/[^a-zàâäçéèêëîïôöùûüÿ]/)); // plus grand nombre de lettres minuscules successives lettre = max_tableau(mdp.split(/[^a-zA-ZàâäçéèêëîïôöùûüÿÀÂÄÇÉÈÊËÎÏÔÖÙÛÜ]/)); // plus grand nombre de lettres successives chiffre = max_tableau(mdp.split(/[^0-9]/)); // plus grand nombre de chiffres successives different = dedoublonne(mdp).length; // nombre de caractères différents if (majuscule == longueur || minuscule == longueur || chiffre == longueur || different == 1) { score = 1; // score maximum s'il n'y a que des caractères d'un même type } else { score = different; score -= majuscule; score -= minuscule; if (score < 2) {score = 2;} // score minimum s'il y a des majuscules et minuscules if (chiffre > 0) {score++;} accent = mdp.split(/[àâäçéèêëîïôöùûüÿÀÂÄÇÉÈÊËÎÏÔÖÙÛÜ]/).length-1; // nombre d'occurence de caractères accentués français nonalphanum = mdp.split(/[^A-Za-z0-9]/).length-1-accent; // nombre d'occurence de caractères non-alphanumérique if (accent > 0) {score++;} // bonus en présence d'accent(s) if (nonalphanum > 0) {score += 2;} // bonus en présence de caractère(s) non-alphanumérique(s) if (majuscule > 0 && minuscule > 0 && chiffre >0 && accent > 0 && nonalphanum > 0) {score++;} //bonus pour la présence de caractères de différent type if (score > 6 && lettre > (longueur/2)) {score = 6;} // score maximum s'il y a trop de lettres qui se suivent } } else { score = 0; // score nul pour un mot de passe trop court } return score; } function vumetre_mdp(degre, style) // affiche les couleurs en fonction du score obtenu { var couleurs = new Array ('#c00', '#f00', '#ff4000', '#ff8000', '#ffc000', '#ff0', '#c0ff00', '#0f0'); // couleurs du vumètre document.getElementById(style+'0').style.color='inherit'; // affichage du texte précédent les cases // document.getElementById(style+'0').style.color='#000'; // version supportée par IE 6 ou 7 for (i = 1 ; i <= couleurs.length ; i++) { if (degre >= i) { document.getElementById(style+i).style.background=couleurs[i-1]; // mise en couleur d'une case } else { document.getElementById(style+i).style.background='#fff'; // retour au blanc d'une case } } }
21 juin 2011 à 22:57
- le plus simple, ne mettre que 4 couleurs dans le tableau couleurs (ligne 74) sans changer sa taille. C'est-à-dire que les 4 couleurs apparaissent 2 fois.
- sinon, réduire le tableau à 4 couleurs (donc le tableau passe de 8 à 4 éléments), diviser le score par 2 (ligne 69) et supprimer les div confiance5 à confiance8
Dans un autre genre, voir :
http://www.lafermeduweb.net/billet/chronostrength-testez-la-securite-de-vos-passwords-avec-jquery-831.html
17 juin 2011 à 17:15
Si on veut uniquement quatre niveaux au lieu des huit par défaut (avec comme couleur rouge,orange, jaune et vert comme code de couleur), que doit-on modifier dans le code?
2 sept. 2008 à 16:56
C'est bien parce que l'on ne peut pas avoir un dictionnaire coté client que je me suis préoccupé de distinguer tous les "types" de caractères et de compter combien se suivent.
L'idée est bien de "reconnaître" un mot avec les moyens du bord. Une personne qui sait choisir un mot de passe dans les règles de l'art obtiendra au final un bon score.
Il est vrai que pour votre exemple le premier aura un score un petit peu moins bon que le deuxième, ce qui ne se justifie pas. Mais adcADC123@# affichera un score mauvais à 6 caractères puis moyen à 9, alors que #aD1dA2Cc3@ affichera un score assez bon dès les 6 premiers caractères. C'est plutôt cohérent il me semble.
Et si je me suis contenté de mettre les correctifs pour IE7 en commentaire au lieu de faire un test sur le navigateur, c'est que trouve embêtant que le code donne un bon score à Hébété1, juste parce que les accents ne sont pas géré...
Cordialement, Ludovic
2 sept. 2008 à 09:47
Il est certain que "b0n!Jour" est plus secure que "0Bonjour!" mais ça c'est parce que le mot de passe contient un mot du dictionnaire ce que ta source ne peut tester.
Exemple:
adcADC123@# est tout aussi robuste que #aD1dA2Cc3@
Tester les mots du dictionnaire serait un vrai plus, cependant je ne pense pas que ce soit réalisable coté client en javascript.
Cordialement,
Pierrick
1 sept. 2008 à 22:42
I. concernant IE :
Je n'ai pensé à tester sur IE qu'après avoir déposer le source. Que ce soit le IE6 ou 7 rien... :-(
Mais le problème vient peut-être d'une erreur dans le css, pas forcément du javascript : faut que je regarde de plus près...
II. concernant la ligne 30
J'ai eu un copier/coller malheureux, en attendant un correctif, il faut lire :
majuscule = max_tableau(mdp.split(/[^A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸ]/));
III. Concernant le calcul du score
Personnellement je trouve que "0Bonjour!" est potentiellement moins robuste que "b0n!Jour". Ceci dit je ne suis pas un spécialiste des codes de crack...
Enfin, il est assez facile (il me semble) de moduler ce code pour se contenter de tester la présence des minuscules/majsucules/chiffres/autres.
IV. Merci pour vos remarques
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.