J'ai un site Web et mes utilisateurs utiliseront leur mot de passe sélectionné pour crypter leur RSA clé privée en utilisant JavaScript côté client. Comment dois-je m'assurer qu'ils utilisent un mot de passe fort sans le transmettre au serveur?
Vous pouvez utiliser zxcvbn , qui est une bibliothèque JavaScript qui vérifie la force des mots de passe.
Alternativement, HaveIBeenPwned API adopte une approche intéressante pour vérifier les mots de passe sans envoyer le mot de passe au serveur:
De cette façon, vous ne soumettez pas le mot de passe complet mais le client n'a pas non plus besoin de récupérer la base de données de mot de passe entière.
Ma question principale sur la force des mots de passe est NIST SP 800-63b: "Digital Identity Guidelines: Authentication and Lifecycle Management" . Bien qu'il s'agisse d'une norme du gouvernement américain, il sert également de guide solide pour le reste d'entre nous.
5.1.1.2 Vérificateurs secrets mémorisés
...
Lors du traitement des demandes d'établissement et de modification de secrets mémorisés, les vérificateurs DEVRAIENT comparer les secrets potentiels à une liste contenant des valeurs connues pour être couramment utilisées, attendues ou compromises. Par exemple, la liste PEUT inclure, mais sans s'y limiter:
Mots de passe obtenus à partir de corpus de violation précédents.
Mots du dictionnaire.
Caractères répétitifs ou séquentiels (par exemple, "aaaaaa", "1234abcd").
Mots spécifiques au contexte, tels que le nom du service, le nom d'utilisateur et ses dérivés.
Si le secret choisi se trouve dans la liste, le CSP ou le vérificateur DEVRA informer l'abonné qu'il doit sélectionner un secret différent, DEVRA fournir la raison du rejet et DEVRA obliger l'abonné à choisir une valeur différente.
Les vérificateurs DEVRAIENT offrir des conseils à l'abonné, tels qu'un compteur de force de mot de passe [Mètres], pour aider l'utilisateur à choisir un secret mémorisé fort. Ceci est particulièrement important après le rejet d'un secret mémorisé sur la liste ci-dessus car il décourage la modification triviale des secrets mémorisés listés (et probablement très faibles) [Blacklists].
Remarquez comment ils suggèrent d'utiliser des indicateurs de force (comme zxcvbn) simplement comme une aide à l'interface utilisateur, mais l'application réelle se fait contre une liste noire.
D'après mon expérience, la meilleure façon de mettre en œuvre cela est d'utiliser un indicateur de force basé sur l'entropie côté client (javascript) comme zxcvbn pour aider l'utilisateur à éliminer les phrases de passe manifestement faibles. Puis, lorsqu'ils cliquent sur Soumettre, effectuez un appel REST vers une base de données de liste noire comme HaveIBeenPwned. Notez que l'API HaveIBeenPwned a été conçue pour éviter de divulguer le mot de passe réel de l'utilisateur, même aux administrateurs HaveIBeenPwned, comme @ Sjoerd décrit bien dans sa réponse.
Mesurer l'entropie des mots de passe n'est pas une tâche facile, et fondamentalement même pas faisable. Tout système ou mesure peut être contourné s'il est suffisamment essayé. Si les utilisateurs le souhaitaient vraiment, ils pourraient probablement même s'en tirer en utilisant quelque chose comme ????
.
Il est préférable de donner des instructions aux utilisateurs sur la façon de choisir un bon mot de passe, telles que:
Il est recommandé d'utiliser un gestionnaire de mots de passe pour générer un mot de passe long et aléatoire et le stocker dans un endroit sûr.
Si l'utilisation d'un gestionnaire de mots de passe n'est pas possible, il est recommandé d'utiliser Diceware pour générer un mot de passe suffisamment bon.
... Et ainsi de suite et ainsi de suite ...
"la force du mot de passe" n'est pas une métrique clairement définie. Et lors de l'implémentation d'un tel vérificateur, veuillez garder à l'esprit que la plupart des bibliothèques implémentent toujours les anciennes directives NIST et erronées (caractères spéciaux, chiffres, ce non-sens).
L'indicateur de force du mot de passe le plus puissant est longueur. Exiger une longueur minimale raisonnablement élevée, qui (2019) est d'environ 12 caractères ou 16 pour les choses importantes, est la vérification unique la plus forte que vous puissiez avoir. Mike a déjà inclus les recommandations pertinentes du NIST pour plus de détails.
Si vous utilisez une bibliothèque, choisissez-en une qui implémente les directives actuelles NIST, pas les anciennes.