Lecture de code de Safe, une bibliothèque pour examiner la force des mots de passe en Python

Safe est une bibliothèque pour vérifier la force des mots de passe.

https://pypi.python.org/pypi/Safe/ https://github.com/lepture/safe

INSTALL

Vous pouvez l'installer avec pip.

$ pip install safe

Essayez l'exemple de code README

Pour le moment, importez "safe".

>>> import safe

Vous pouvez vérifier la force avec la fonction safe.check ().

>>> safe.check(1)
terrible
>>> safe.check('password')
simple
>>> safe.check('is.safe')
terrible
>>> safe.check('x*V-92Ba')
strong

La valeur de retour est une instance de safe.Strength ().

>>> type(safe.check('x*V-92Ba'))
<class 'safe.Strength'>

Le résultat peut être converti en bool ().

>>> bool(safe.check('x*V-92Ba'))
True
>>> bool(safe.check('a'))
False

Lecture de code

Je vais lire le code.

safe.check () -Vérifier la force du mot de passe

https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L147-L189

La fonction safe.check () vérifie la force du mot de passe.

argument

Vous pouvez passer raw, length, freq, min_types, level comme arguments.

raw est la chaîne de mot de passe que vous souhaitez rechercher. Normalement, str est passé, mais to_unicode () se fait sans fonction, et même si int est passé, il est converti en str et traité. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L156

to_unicode () est défini dans _compat.py. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/_compat.py#L28-L38

«length» est la longueur requise du mot de passe. freq est utilisé pour trouver des mots de passe communs.

min_types spécifie combien de types de caractères doivent être inclus. Par exemple, lorsque min_types = 3 et length = 3, «1qA» est OK (nombre / minuscules / majuscules) et «1qa» est NG (nombre / partie inférieure).

>>> bool(safe.check('1qA', length=3, min_types=3))
True
>>> bool(safe.check('1qa', length=3, min_types=3))
False

level est le seuil pour savoir si la force du mot de passe est valide ou non. Il semble que int / float est acceptable pour la valeur d'entrée, mais même si vous spécifiez une valeur supérieure ou égale à STRONG, elle sera renvoyée à STRONG (sinon, elle sera toujours invalide ...). https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L157-L158

le niveau est défini comme suit:

TERRIBLE = 0
SIMPLE = 1
MEDIUM = 2
STRONG = 3

Valeur de retour

La valeur de retour est une instance de «safe.Strength». «safe.Strength» a les attributs «valid», «force» et «message».

valid est une valeur booléenne. Vrai est valide. «force» est une chaîne qui indique la force. La corde qui prend de la force est l'une des suivantes:

Chaîne de caractères utilisée pour la force sens
strong Fort
medium d'accord
simple Facile
terrible Nez baise(Traduction gratuite)

(À propos, cette chaîne est codée en dur dans le code lorsque le safe.Strength est instancié orz)

message est un message qui montre pourquoi il a été jugé ainsi.

Cette fonction retournera le résultat correctement si vous passez une chaîne qui peut être interceptée dans safe.is_asdf () avec un caractère, par exemple.

>>> safe.check('a', length=0, min_types=0)
simple

Cependant, si vous passez une chaîne de caractères qui ne se retrouve pas dans safe.is_asdf () avec un caractère, l'exception envoyée par safe.is_by_step () sera levée sans traitement.

>>> safe.check('(', length=0, min_types=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/sximada/ng/env/lib/python3.4/site-packages/safe/__init__.py", line 163, in check
    if is_asdf(raw) or is_by_step(raw):
  File "/home/sximada/ng/env/lib/python3.4/site-packages/safe/__init__.py", line 89, in is_by_step
    delta = ord(raw[1]) - ord(raw[0])
IndexError: string index out of range

En effet, l'erreur n'est pas gérée correctement au moment du contrôle de l'état. safe.is_by_step () sera décrit plus tard, mais lors du passage d'une chaîne d'un caractère, une exception IndexError sera levée. Si safe.is_asdf () est une chaîne non-True (par exemple, (), un caractère ( passera à safe.is_by_step ().

    if is_asdf(raw) or is_by_step(raw):
        return Strength(False, 'simple', 'password has a pattern')

https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L163-L164

Cependant, il est rare qu'un personnage soit autorisé à être vérifié, donc je pense que je n'ai pas à être trop nerveux.

safe.is_asdf () -Détermine si le clavier est dans l'ordre

https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L72-L83

Détermine si la chaîne donnée est dans l'ordre du clavier. L'ordre ici est la chaîne de caractères définie aux endroits suivants. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L69 Par conséquent, tous les modèles de commande de clavier ne sont pas inspectés. (N'est-ce pas un peu trop petit?)

argument

raw est la chaîne de caractères à juger. La chaîne de caractères spécifiée par raw et la chaîne de caractères dont l'ordre est inversé sont sujettes à jugement. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L75

Valeur de retour

Valeur booléenne. Renvoie True s'il est dans l'ordre des claviers.

safe.is_by_step () --Détermine s'il s'agit d'une chaîne de type code de décalage

https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L86-L95

Le chiffrement par décalage est une méthode de chiffrement classique et aimable (mais jamais utilisée) qui se décale de n caractères. Parmi eux, le code César est célèbre et se décale de 3 caractères. Par exemple, si vous décalez la chaîne de caractères «test» de 3 caractères, vous obtiendrez la chaîne de caractères «whvw». Une telle corde se fissure en un clin d'œil, donc ça me donne juste envie de la cacher et ça ne veut rien dire. Cette fonction détermine s'il s'agit d'une telle chaîne de caractères.

La distance entre le 1er et le 0ème caractère de la chaîne de caractères spécifiée «raw» est mesurée. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L89

Après cela, il est jugé si tous les caractères sont décalés en fonction de la distance. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L91-L95

Si vous passez une chaîne de caractères de longueur 1, IndexError sera envoyé.

>>> safe.is_by_step('a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/sximada/ng/env/lib/python3.4/site-packages/safe/__init__.py", line 89, in is_by_step
    delta = ord(raw[1]) - ord(raw[0])
IndexError: string index out of range

argument

raw est la chaîne de caractères à juger.

Valeur de retour

La valeur booléenne. Vrai s'il s'agit d'une chaîne de caractères de type code de décalage.

safe.is_common_password () -Déterminer s'il s'agit d'un mot de passe couramment utilisé

https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L98-L106

Selon la docstring, il indique qu'il utilise le mot de passe commun 1000 à https://xato.net/passwords/more-top-worst-passwords/, mais malheureusement, cette URL était 404 introuvable ( Hey!!).

Une liste des mots de passe couramment utilisés est incluse dans le package. Cette liste est utilisée par défaut. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/words.dat

Ce fichier a le format suivant.

Niveau de fréquence des cordes

Le niveau fréquent est un entier utilisé pour le jugement, et plus la valeur est élevée, plus elle est utilisée fréquemment.

Ce fichier peut également être un fichier personnalisé. Dans ce cas, si vous spécifiez le chemin du fichier personnalisé dans la variable d'environnement PYTHON_SAFE_WORDS_FILE, celui-ci sera utilisé.

Les données de ce fichier sont utilisées comme dict sous la forme {'string': integer, ...} lorsqu'il est utilisé. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L58-L61

Après cela, le dict est mis en cache et l'emplacement du fichier cache peut être spécifié par la variable d'environnement PYTHON_SAFE_WORDS_CACHE.

Ces données lisent le fichier lors de l'importation du package sécurisé et le conservent dans safe.WORDS. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L68

Par conséquent, si PYTHON_SAFE_WORDS_FILE est spécifié et que le fichier n'existe pas, FileNotFoundError sera renvoyé et l'importation échouera (spécification légèrement pénible).

argument

raw est la chaîne de caractères à juger. «freq» semble être un niveau couramment utilisé. Plus le nombre est élevé, plus il est utilisé.

Valeur de retour

La valeur booléenne. Vrai pour les chaînes couramment utilisées. False si le niveau de fréquence est inférieur ou égal à la valeur spécifiée par l'argument freq. Il est également False s'il ne correspond pas à une chaîne de caractères couramment utilisée.

safe.safety () - Fonctions non publiées mais de type utilité publique

safe.safety () est une fonction qui appelle simplement safe.check () et renvoie sa valeur de retour. La différence entre les deux est la valeur par défaut de l'argument. safe.check () a un min_type de 3, tandis que safe.safety () a une valeur de 2. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L192-L193

Mais cette fonction n'est pas incluse dans all. Et je ne l'utilise pas dans le paquet. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L20-L23 Est-il oublié de l'inclure, ou n'est-il pas inclus en raison de l'intention de l'auteur de l'abolir (bien que je ne veuille pas que vous le fassiez de cette façon ...), dans tous les cas, c'est sûr sans utiliser cette fonction Il semble préférable d'utiliser .check (). (Au fait, cet auteur écrit assez bien all dans _compat.py, donc ça sent comme si j'avais oublié de l'écrire.)

Épilogue

Cette bibliothèque est une petite bibliothèque avec seulement environ 200 lignes. Il était simple, donc il semblait très facile à utiliser. J'ai passé environ 2 heures à écrire cet article. -> Environ 100 lignes par heure

Recommended Posts

Lecture de code de Safe, une bibliothèque pour examiner la force des mots de passe en Python
Lecture de code de m3u8, une bibliothèque de manipulation de fichiers m3u8 au format vidéo HLS avec Python
Code pour vérifier le fonctionnement de Python Matplot lib
Peut être utilisé avec AtCoder! Une collection de techniques pour dessiner du code court en Python!
Concurrence avec VS Code Créez un environnement Python pour les professionnels sous Windows
Envelopper (partie de) la bibliothèque AtCoder en Cython pour une utilisation en Python
Un bref résumé de Graphviz en python (expliqué uniquement pour mac)
Afficher une liste d'alphabets en Python 3
Obtenez un jeton pour conoha avec python
Un outil pour saisir facilement du code Python
J'ai créé un outil de mot de passe en Python.
[Édition DSU] Lecture de la bibliothèque AtCoder avec un codeur vert ~ Implémentation en Python ~
Code Python pour déterminer les signaux mensuels pour les investissements de force relative
Dessiner un graphique d'une fonction quadratique en Python
Récupérer l'appelant d'une fonction en Python
Copiez la liste en Python
Réécrire des éléments dans une boucle de listes (Python)
Créez un tracé de R semblable à un joyplot avec python
Sortie sous la forme d'un tableau python
Touchons une partie de l'apprentissage automatique avec Python
Paramètres de codage Python avec Visual Studio Code
Environnement enregistré pour l'analyse des données avec Python
Histoire de base de l'héritage en Python (pour les débutants)
Exemple de code spécifique pour travailler avec SQLite3 en Python
Un mémorandum lors de l'écriture de code expérimental ~ Se connecter en python
Paramètres VS Code pour le développement en Python avec achèvement
Essayez de rechercher un profil d'un million de caractères en Python
Ruby, exécution de fragments de code Python de la sélection dans Emacs
Python: obtenir une liste de méthodes pour un objet
Regrouper par éléments consécutifs d'une liste en Python
Afficher un histogramme des valeurs de luminosité de l'image en python
Un mémorandum sur la mise en œuvre des recommandations en Python
Expose settings.json pour un codage Python efficace avec VS Code
[Python] Code pour mesurer la lumière ambiante RVB de l'APDS9960
Publier / télécharger une bibliothèque créée en Python vers PyPI
Définir le proxy pour Python pip (décrit dans pip.ini)
Code python de la méthode k-means super simple
Crache une liste de noms de fichiers, de dates de dernière modification et de codes de caractères en python3
Découvrez la largeur apparente d'une chaîne en python
Vérifiez le fonctionnement de Python pour .NET dans chaque environnement
Créer un tableau de multiplication de chaque élément dans une feuille de calcul (Python)
Créer un compte enfant de connect with Stripe en Python
[Pour les débutants] Résumé de l'entrée standard en Python (avec explication)
Obtenez le nombre d'éléments spécifiques dans la liste python
Comparaison du code de moyenne mobile exponentielle (EMA) écrit en Python
Création d'un environnement de développement pour les applications Android - Création d'applications Android avec Python
Un moyen simple d'éviter plusieurs boucles for en Python
Développer une bibliothèque pour obtenir la liste des collections Kindle en Python
Comment définir plusieurs variables dans une instruction Python for
Comment développer dans un environnement virtuel Python [Memo]
Faites quelque chose comme un interpréteur Python avec Visual Studio Code
Un exemple pour dessiner des points avec PIL (Python Imaging Library).
[Note] Importation de fichiers dans le répertoire parent en Python
Décrypter une ligne de code en Python lambda, carte, liste
Créez le code qui renvoie "A et prétendant B" en python
Essayez de créer un réseau de neurones en Python sans utiliser de bibliothèque
Comment obtenir une liste d'exceptions intégrées pour python