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

Soyez le premier à donner votre avis sur cette source.

Vue 6 671 fois - Téléchargée 648 fois

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

Ajouter un commentaire

Commentaires

vilfarfadet
Messages postés
9
Date d'inscription
mardi 19 décembre 2000
Statut
Membre
Dernière intervention
19 février 2009

2 options pour réduire le vumètre :
- 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
ghetto95
Messages postés
15
Date d'inscription
lundi 15 février 2010
Statut
Membre
Dernière intervention
17 juin 2011

Bonjour,
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?
vilfarfadet
Messages postés
9
Date d'inscription
mardi 19 décembre 2000
Statut
Membre
Dernière intervention
19 février 2009

Bonjour Pierrick,

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
the_wwt
Messages postés
177
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
16 janvier 2009
1
Salut,
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
vilfarfadet
Messages postés
9
Date d'inscription
mardi 19 décembre 2000
Statut
Membre
Dernière intervention
19 février 2009

Bonjour,

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.