Suite aux commentaires postés sur les sources de Zuff (4/9/07) et d'Axel971 (22/4/06), qui déterminent la sécurité offerte par un mot de passe, j'ai écrit un nouveau javascript qui soit capable de distinguer les différents types de caractères (majuscules, minuscules, chiffres, accents, non-aplanumériques), leur répétition, et leur succession.
A partir de là, le javascript retourne un score qui est utilisé par un vumètre un peu plus sophistiqué que dans les sources précédents (8 niveaux au lieu de 3).
Il y a un peu d'expressions régulières basiques pour ceux qui souhaitent se faire la main avec :-)
Source / Exemple :
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
}
}
}
Conclusion :
Le code est aisément modifiable pour améliorer l'estimation du "niveau de sécurité" atteint par un mot de passe.
Le zip comprend en plus du javacscript, le xhtml et le css nécessaire pour le tester, ainsi que des fonctions basiques supplémentaires (test si un champ est vide, etc...)
Les commentaires (constructifs :-) sont les bienvenus
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.