Fournir un retour instantané est ce qu'il y a de mieux en ce moment. Pourquoi vous limiter à vérifier les noms d'utilisateur et les adresses e-mail? Pourquoi ne pas l'étendre pour fournir un retour visuel rapide sur la force du mot de passe saisi par l'utilisateur? Aujourd'hui, nous allons voir comment créer un vérificateur de force de mot de passe simple à l'aide de la bibliothèque jQuery, d'expressions régulières et d'un algorithme simple..
Comme le diront la plupart des experts en sécurité, l'utilisateur est toujours le lien le plus faible. Les systèmes les plus sécurisés sont vulnérables lorsqu'un utilisateur choisit un mot de passe extrêmement déconseillé. En gardant cela à l'esprit, la tendance récente semble fournir à l'utilisateur un retour rapide sur la force du mot de passe afin que l'utilisateur puisse étendre ou modifier le mot de passe pour le rendre plus sécurisé..
Aujourd'hui, nous allons utiliser la bibliothèque jQuery, un groupe d'expressions régulières et un algorithme très simple pour créer un vérificateur de base de la force du mot de passe. Intéressé? Commençons tout de suite! Voici une démonstration de ce que nous essayons de construire aujourd'hui:
Nos objectifs de conception pour cette fonctionnalité spécifique sont relativement petits.
Maintenant que nous avons bien cerné nos besoins, nous pouvons passer à l'étape suivante..
Nous allons maintenant décider de l'ordre des étapes à suivre..
Dans l'intérêt de garder cette écriture succincte et accessible, j'ai décidé de choisir un algorithme très basique. L'algorithme analyse la chaîne, donne des bonus pour la longueur supplémentaire, la présence de chiffres, de symboles et de lettres majuscules et des pénalités pour les entrées de lettres ou de chiffres uniquement. Nous n'allons pas chercher à faire correspondre des modèles courants ou à comparer l'entrée avec un dictionnaire, car cela sort du cadre de l'article. Si les intérêts montent, je ferai peut-être un article à ce sujet à l'avenir.
Nous vérifions d'abord la longueur de la chaîne d'entrée. Si elle est supérieure à la longueur minimale, attribuez-lui un score de base de 50. Sinon, définissez-la sur 0. Ensuite, parcourez chaque caractère de la chaîne et vérifiez s'il s'agit d'un symbole, d'un chiffre ou d'une lettre majuscule. Si oui, en prendre note.
Ensuite, vérifiez le nombre de caractères supplémentaires de la chaîne par rapport au minimum recommandé et accordez un bonus pour chaque personnage. Accordez également un bonus si la chaîne contient une combinaison de lettres majuscules, de chiffres et de symboles, ou les trois. Accorder un bonus pour la présence de chacun aussi.
Vérifiez si la chaîne ne contient que des lettres minuscules ou des chiffres et, le cas échéant, pénalisez.
Additionnez tous les nombres et décidez la force du mot de passe en conséquence.
C'est le long et court de l'algorithme. Cela ne va pas excessivement suave mais attrape beaucoup de mauvais mots de passe. Vous comprendrez mieux cela une fois que nous le verrons dans le code.
Le balisage HTML de la page de démonstration ressemble à ceci:
Vérificateur de force de mot de passe simple - par Siddharth pour NetTuts Créer un vérificateur de force de mot de passe simple
par Siddharth pour les adorables gens de Net Tuts
Tapez votre mot de passe pour obtenir un retour visuel sur la force de votre mot de passe.
Je vous assure que je ne vole pas vos mots de passe. Le formulaire ne pas soumettre. Vous pouvez consulter la source si vous êtes suspect. :)
Entrez une valeur aléatoireRépartition des points
Ne tenez pas compte de tout le balisage habituel. Remarquez l'élément d'entrée avec un ID de saisir mot de passe, l'élément div avec un identifiant de complexité qui montre la complexité du mot de passe et de l'élément div avec un ID de détails qui montre la répartition des points.
Nous avons également inclus la bibliothèque jQuery et notre propre fichier de script. Des points supplémentaires si vous appréciez le nom de notre fichier script.
body font-family: "Lucida Grande", "Verdana", sans serif; h1 font-size: 30px; rembourrage: 0; marge: 0; h2 font-size: 18px; rembourrage: 0; marge: 0 5px 30px 0; input width: 288px; hauteur: 30px; marge: 50px 0 0 0; rembourrage: 3px 5px; taille de police: 22px; font-family: "Lucida Grande", "Verdana", sans-serif; #container width: 820px; marge gauche: auto; marge droite: auto; remplissage: 50px 0 0 0; .block width: 300px; marge: 0 auto 0 auto; #complexity, #résultat width: 300px; remplissage: 3px 0; hauteur: 20px; couleur: # 000; taille de police: 14px; text-align: center; #results margin: 30px 0 20px 0; .default background-color: #CCC; .weak background-color: # FF5353; .strong color-background: # FAD054; .stronger background-color: # 93C9F4; .strongest background-color: # B6FF6C; span.value font-weight: bold; Flotter à droite;
Juste la plaque de chaudière CSS pour les mises en page et la typographie. Nous avons un tas de classes au bas de chaque cote de force. Nous les ajouterons aux éléments si nécessaire.
Maintenant que nous disposons d’un cadre solide et d’un certain style de base, nous pouvons commencer à coder les fonctionnalités requises. Notez que nous utilisons beaucoup jQuery. N'hésitez pas à vous connecter au CDN de Google si nécessaire.
Étant donné que la jonglerie numérique va continuer, nous avons besoin de plusieurs variables pour conserver les valeurs. Comme il s’agit d’une démonstration et non d’un code de production, j’ai décidé de déclarer les variables globales et d’y accéder par le biais des méthodes d’aide au lieu de les déclarer en interne, puis de les transmettre aux fonctions..
var strPassword; var charPassword; var complex = $ ("# complex"); var minPasswordLength = 8; var baseScore = 0, score = 0; var num = ; num.Excess = 0; num.Upper = 0; num.Numbers = 0; num.Symbols = 0; var bonus = ; bonus.Excess = 3; bonus.Upper = 4; bonus.Nombre = 5; bonus.Symbols = 5; bonus.Combo = 0; bonus.FlatLower = 0; bonus.FlatNumber = 0;
Les noms de variables sont assez standard mais je ferais quand même un aperçu. strPassword détient la valeur de la zone de saisie, charPassword est un tableau contenant chaque caractère de la chaîne, complexité contient une référence à l'élément div. Nous définissons également la longueur minimale du mot de passe, le score et le score de base.
Nous créons un hachage rapide pour contenir le nombre de caractères supplémentaires, de majuscules, de nombres et de symboles. Nous faisons la même chose pour les bonus. le num le hachage contient le nombre de caractères tandis que le prime Le hachage contient les multiplicateurs de bonus. Vous pouvez simplement créer des variables individuelles mais je pense que cela semble plus propre.
N'oubliez pas de connecter le gestionnaire d'événement à l'événement.
$ ("# inputPassword"). bind ("keyup", checkVal);
checkVal est le gestionnaire d'événements que nous allons créer dans un tout petit peu.
function checkVal () if (charPassword.length> = minPasswordLength) baseScore = 50; analyseString (); calcComplexity (); else baseScore = 0; outputResult ();
Nous vérifions d'abord la longueur de la chaîne d'entrée. Si elle est supérieure ou égale à la longueur minimale spécifiée, nous pouvons continuer. Nous fixons le score de base à 50 et appelons les méthodes auxiliaires qui analysent la chaîne et calculent sa complexité.
Si elle est inférieure à la longueur attendue, il suffit de définir le score de base sur 0.
Nous appelons ensuite le outputResult fonction qui prend en charge de donner un sens aux calculs calculés. Nous verrons comment cela fonctionne plus tard, ci-dessous.
function analyseString () pour (i = 0; iCela a peut-être l'air un peu compliqué mais je vous promets que c'est uniquement à cause des expressions régulières. Passons en revue le code partie par partie.
Premièrement, nous devons déterminer la composition de la chaîne en question. Au fur et à mesure, nous devons déterminer si la chaîne contient des lettres majuscules, des chiffres ou des symboles et, dans l'affirmative, combien d'entre eux sont présents. En gardant cela à l’esprit, nous parcourons le tableau de caractères et vérifions chaque caractère pour voir son type. le rencontre La méthode nous permet de faire correspondre une chaîne à une expression régulière. Si vous êtes nouveau dans l'expression régulière, je vous suggère de lire l'excellent article de Vasili ici.
Ensuite, nous avons déterminé la différence entre la longueur de la chaîne d'entrée et la longueur minimale spécifiée du mot de passe. Cela nous donne le nombre excessif de personnages avec lesquels jouer..
Nous vérifions ensuite si la chaîne a des majuscules, des chiffres et des symboles. Si oui, accordez un bonus. Nous vérifions également s’il existe une combinaison de deux d’entre elles et accordons un bonus plus faible, le cas échéant..
Enfin, nous vérifions si une chaîne est plate: elle ne contient que des lettres minuscules ou uniquement des chiffres. Nous vérifions cela avec une expression régulière et si oui pénalisons le mot de passe pour cette pratique..
Calculer la complexité
function calcComplexity () score = baseScore + (num.Excess * bonus.Excess) + (num.Upper * bonus.Upper) + (num.Numbers * bonus.Numbers) + (num.Symbols * bonus.Symbols) + bonus .Combo + bonus.FlatLower + bonus.FlatNumber;Juste un ajout simple. Nous ajoutons le score de base au produit du nombre de caractères en excès et de son multiplicateur. Idem pour les lettres majuscules, les chiffres et les symboles. Nous ajoutons ensuite un bonus pour les combinaisons, le cas échéant, et ajoutons des pénalités si la chaîne est plate.
Mise à jour de l'interface utilisateur
Maintenant que tous les calculs sont derrière nous, nous pouvons mettre à jour l'interface utilisateur pour refléter les changements. Voici chacun des états.
function outputResult () if ($ ("# inputPassword"). val () == "") complex.html ("Entrez une valeur aléatoire"). addClass ("default"); else if (charPassword.length < minPasswordLength) complexity.html("At least " + minPasswordLength+ " characters please!").addClass("weak"); else if (score<50) complexity.html("Weak!").addClass("weak"); else if (score>= 50 && score<75) complexity.html("Average!").addClass("strong"); else if (score>= 75 && score<100) complexity.html("Strong!").addClass("stronger"); else if (score>= 100) complex.html ("Secure!"). AddClass ("strongest");Rien d'extraordinaire ici mais nous allons le parcourir ligne par ligne.
Nous vérifions d'abord si l'entrée est vide. Si oui, changez le texte du résultat et ajoutez un défaut classe pour changer sa couleur de fond à son gris d'origine.
Si elle est inférieure à la longueur minimale spécifiée, nous modifions le texte en conséquence et ajoutons un faible classe donc son fond est rouge. Nous faisons la même chose si le score total est inférieur à 50 mais changeons le texte en faible.
Au fur et à mesure que le score augmente, nous modifions le texte en conséquence et ajoutons les classes nécessaires. N'hésitez pas à modifier les scores de base pour chaque note. Je viens de mettre en valeurs non scientifiques pour obtenir la démo en cours.
Mise à jour de la ventilation détaillée
Avec le résultat principal mis à jour, nous pouvons examiner la mise à jour des statistiques maintenant.
function outputResult () // Code précédent $ ("# détails"). html ("Score de base:"+ baseScore +""+"
Bonus de longueur:"+ (num.Excess * bonus.Excess) +" ["+ num.Excess +" x "+ bonus.Excess +"] "+"
Bonus majuscule:"+ (num.Upper * bonus.Upper) +" ["+ num.Upper +" x "+ bonus.Upper +"] "+"
Bonus de nombre: "+ (num.Numbers * bonus.Numbers) +" ["+ num.Numbers +" x "+ bonus.Numbers +"]"+"
Bonus de symbole: "+ (num.Symbols * bonus.Symbols) +" ["+ num.Symbols +" x "+ bonus.Symbols +"]"+"
Bonus de combinaison: "+ bonus.Combo +""+"
Minuscule seulement pénalité: "+ bonus.FlatLower +""+"
Nombres seulement pénalité: "+ bonus.FlatNumber +""+"
Score total: "+ score +""Cette partie n'est pas aussi déroutante qu'il n'y paraît. Laisse-moi expliquer.
Au lieu de simplement mettre à jour les valeurs individuelles pour les résultats détaillés, je me suis contenté de mettre à jour la valeur HTML complète du conteneur. Je sais qu’un certain nombre de boîtes s’additionnera s’avérer léthargique, mais accéder à chaque élément individuellement, puis mettre à jour sa valeur pour une petite démonstration semblait plutôt contre-productif. Alors cours avec moi ici.
C'est comme si vous injectiez du code HTML normal dans un élément, sauf que nous avons placé quelques variables à l'intérieur pour permettre la mise à jour instantanée des détails. Chaque valeur obtient un valeur classe pour le rendre audacieux. Nous affichons également le nombre de caractères spéciaux et son multiplicateur afin que l'utilisateur puisse déterminer quels éléments obtiennent le plus de poids..
Quelques ajustements
A ce moment, il y a 2 bugs qui apparaissent.
- Si vous tapez un mot de passe long, puis effacez la zone de texte, les couleurs d'arrière-plan ne sont pas modifiées..
- Dans le même scénario, les détails des points ne sont pas mis à jour correctement..
Nous allons les aborder un à un.
Pour le premier bogue, la cause principale est le fait que nous ne supprimons pas toutes les autres classes. Ce ne serait pas un problème si les classes les plus récemment ajoutées ont priorité sur les autres. Malheureusement, ce n'est pas le cas. Voici une solution rapide.
function outputResult () if ($ ("# inputPassword"). val () == "") complex.html ("Entrez une valeur aléatoire"). removeClass ("faible fort fort fort fort"). addClass ("défaut "); else if (charPassword.length < minPasswordLength) complexity.html("At least " + minPasswordLength+ " characters please!").removeClass("strong stronger strongest").addClass("weak"); else if (score<50) complexity.html("Weak!").removeClass("strong stronger strongest").addClass("weak"); else if (score>= 50 && score<75) complexity.html("Average!").removeClass("stronger strongest").addClass("strong"); else if (score>= 75 && score<100) complexity.html("Strong!").removeClass("strongest").addClass("stronger"); else if (score>= 100) complex.html ("Secure!"). AddClass ("strongest"); // Détails du code de mise à jourVous demandez probablement pourquoi nous ne supprimons pas chaque classe ici. La réponse est simple: nous tirons parti de l’un des principaux attributs de CSS: en cascade. Si vous notez l'ordre de déclaration de chaque classe dans le fichier CSS, vous remarquerez que défaut se produit le premier et le plus fort vient le dernier qui signifie si un élément a la le plus fort classe, il annulera toutes les modifications apportées par une classe supérieure. Il ne faudra donc supprimer que les classes qui se trouvent en dessous de la classe appropriée. Par exemple, pour qu'un élément ait fort, nous devrons enlever le plus forte et le plus fort Des classes.
La raison pour laquelle le deuxième bogue existe est due au fait que les variables individuelles ne sont pas réinitialisées lorsqu'un nouvel événement se produit. Ils reportent également à l'événement suivant. Afin de résoudre ce problème, nous créons une fonction rapide qui réinitialise toutes les variables pertinentes et l’ajoute la checkVal gestionnaire d'événements de sorte qu'il est appelé chaque fois que le texte de la zone de saisie est mis à jour.
function init () strPassword = $ ("# inputPassword"). val (); charPassword = strPassword.split (""); num.Excess = 0; num.Upper = 0; num.Numbers = 0; num.Symbols = 0; bonus.Combo = 0; bonus.FlatLower = 0; bonus.FlatNumber = 0; baseScore = 0; score = 0;function checkVal () init (); // Autre codeLimites
Si vous avez joué un peu avec la démo, vous remarquerez que Pa $$ W0rd $ apparaît comme un mot de passe sécurisé alors qu'en fait il sera cassé très bientôt. Ceci est dû à la simplicité de notre algorithme ici. Nous ne vérifions pas les remplacements de personnage. Ou des mots de passe ou des modèles communs pour cette question. Faire de telles choses augmenterait la difficulté de ce tutoriel tout en réduisant son accessibilité, deux choses que je ne voulais pas pour cet article en particulier.
Ceci est conçu comme un vérificateur de base de la force du mot de passe. Si vous avez besoin de le renforcer, vous pouvez probablement ajouter quelques expressions régulières supplémentaires pour vérifier les motifs et la répétition des caractères, puis ajuster les résultats en conséquence..
Examiner les entrées par rapport à un dictionnaire sort vraiment du cadre de cet article et nécessiterait soit un dictionnaire volumineux téléchargé du côté client, soit un système connecté au système pour le faire. Encore une fois, je voulais vraiment les éviter tous les deux cette fois.
Conclusion
Et voilà: comment ajouter une fonctionnalité conviviale, la possibilité d'informer l'utilisateur de la force du mot de passe qu'il vient d'entrer, pour vos projets. J'espère que vous avez trouvé ce tutoriel intéressant et que cela vous a été utile. Sentez-vous libre de réutiliser ce code ailleurs dans vos projets et insérez-le ici si vous rencontrez des difficultés.
Des questions? De belles choses à dire? Des reproches? Hit la section des commentaires et laissez-moi un commentaire. Bonne codage!
- Suivez-nous sur Twitter ou abonnez-vous au fil RSS Nettuts + pour obtenir les meilleurs tutoriels de développement Web sur le Web..