Estimation du degré de confiance à accorder à un mot de passe (ou niveau de sécurité)

Description

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

Codes Sources

A voir également

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.