7
votes

Comment stocker et rechercher la liste des mots de passe bannés '

Je travaille sur un projet où je dois disposer d'un ensemble de restrictions de mot de passe qui inclut un fichier de mots de passe non autorisé ( tous les mots de passe communs tels que "ABC", "ABCDEF", "Mot de passe" 12345 '' etc. ) Le fichier de mots de passe se comportera d'environ 10000-15000 mots.

Maintenant, je veux m'assurer que lorsqu'un utilisateur définit / change un mot de passe, il n'existe pas dans la liste. Je pensais à utiliser un dictionnaire (ou une carte) en Java (avec des seaux comme «A», 'B', 'C' .... 'Z', 'Numéros »,« SPÉCIAL_CHARS ») afin que je ne viens de vérifier le premier caractère, puis recherchez le godet correspondant. Mais je ne suis pas sûr de quel type de performance je peux sortir de cela.

Toute suggestion de travail avec une liste "mots de passe interdites" .... Tout autre pointeurs à surveiller?


0 commentaires

3 Réponses :


2
votes

Si vous étendez votre approche de "un seau par lettre" à la chaîne complète, vous terminerez avec un trie , qui ressemble à une belle structure pour ce problème, même si je ne peux pas voir une raison pour n'utiliser aucun hashset (après tout, la vérification Le coût est presque constant et les recherches de jeu de hachage dans le godet où le mot de passe est censé être stocké). Division du hachage Selon la lettre initiale n'améliore pas les performances en comparaison avec l'utilisation d'un ensemble unique.

D'autre part, si votre implémentation est limitée de mémoire, vous pouvez éviter de stocker des mots de passe interdits et faire une vérification guidée de la règle (par exemple, vérifier 4 caractères consécutifs qui diffèrent d'une, comme dans "GHIJ", ou Vérifiez s'ils sont des fragments d'une ligne de clavier, tels que «yuiop»). Chaque règle sera équivalente à plusieurs mots de passe interdits.


2 commentaires

C'était ma première supposition, mais je ne suis pas sûr que si une trie sera trop excitée pour cela ou non ... plus que je considère que je devais stocker toute la trie en mémoire. (Ou je manque quelque chose?)


Avec une trie, vous pouvez (en théorie) sauvegarder la mémoire pour des chaînes similaires telles que mot de passe1 et mot de passe2 qui partagent un préfixe commune. Mais ensuite, j'ai réalisé que chaque nœud est une instance, et contient un tableau / une liste des enfants ... un autre peut nécessiter plus de mémoire si vous avez de nombreux préfixes différents. Étant donné que la modification du mot de passe n'est pas une tâche très fréquente, je pense que vous pouvez échanger des cycles de processeur pour moins de regroupement de mémoire.



0
votes

Vous devez écrire une méthode qui peut vérifier la séquence de caractères (ex: abcdef) et les mêmes caractères (ex: 111111) et toutes les autres contraintes. Parallèlement à cela, de la manière dont vous devez prendre une liste statique / une variable définie qui conservera toutes les chaînes restreintes.


2 commentaires

Les séquences et les caractères identiques font également partie des restrictions ... mais je pensais que ce serait plus facile de les aborder avec regex plutôt que de les intégrer au dictionnaire


C'est ce que je dis que je dis. Vous devez gérer ces SEQUESNES et les mêmes chaînes de caractères dans une méthode en utilisant REGX ou une boucle. Seulement vous devez stocker des chaînes restreintes à l'intérieur de cette liste statique une fois et vérifiez à l'aide de la méthode de la liste contenant ().



1
votes

Vous voudrez peut-être utiliser une vraie lib pour faire cela. Par exemple .. https://code.google.com/p/java- Dictionary-Mot de passe-Validator /


0 commentaires