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
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
Je vais lire le code.
https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L147-L189
La fonction safe.check ()
vérifie la force du mot de passe.
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
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.
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?)
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 booléenne. Renvoie True s'il est dans l'ordre des claviers.
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
raw
est la chaîne de caractères à juger.
La valeur booléenne. Vrai s'il s'agit d'une chaîne de caractères de type code de décalage.
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).
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é.
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 () 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.)
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