Codelesen von Safe, einer Bibliothek zur Überprüfung der Kennwortstärke in Python

Safe ist eine Bibliothek zum Überprüfen der Stärke von Passwörtern.

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

INSTALL

Sie können es mit pip installieren.

$ pip install safe

Probieren Sie den README-Beispielcode aus

Importieren Sie vorerst "sicher".

>>> import safe

Sie können die Stärke mit der Funktion safe.check () überprüfen.

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

Der Rückgabewert ist eine Instanz von safe.Strength ().

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

Das Ergebnis kann in bool () konvertiert werden.

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

Code lesen

Ich werde den Code lesen.

safe.check () - Überprüfen Sie die Kennwortstärke

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

Die Funktion safe.check () überprüft die Stärke des Passworts.

Streit

Sie können "raw", "length", "freq", "min_types", "level" als Argumente übergeben.

raw ist die Kennwortzeichenfolge, nach der Sie suchen möchten. Normalerweise wird str übergeben, aber to_unicode () wird ohne Funktion ausgeführt, und selbst wenn int übergeben wird, wird es in str konvertiert und verarbeitet. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L156

to_unicode () ist in _compat.py definiert. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/_compat.py#L28-L38

length ist die erforderliche Passwortlänge. freq wird verwendet, um gebräuchliche Passwörter zu finden.

min_types gibt an, wie viele Zeichentypen enthalten sein sollen. Wenn beispielsweise min_types = 3 und length = 3 ist, ist "1qA" in Ordnung (Zahl / Kleinbuchstaben / Großbuchstaben) und "1qa" ist NG (Zahl / Kleinteil).

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

level ist der Schwellenwert dafür, ob die Stärke des Passworts gültig ist oder nicht. Es scheint, dass int / float für den Eingabewert akzeptabel ist, aber selbst wenn Sie einen Wert größer oder gleich STRONG angeben, wird er an STRONG zurückgegeben (andernfalls ist er immer ungültig ...). https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L157-L158

Level ist wie folgt definiert:

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

Rückgabewert

Der Rückgabewert ist eine Instanz von "safe.Strength". safe.Strength hat die Attribute gültig, Stärke und Nachricht.

valid ist ein Bool-Wert. True ist gültig. Stärke ist eine Zeichenfolge, die Stärke angibt. Die Saite, die an Stärke gewinnt, ist eine der folgenden:

Zeichenkette für Stärke Bedeutung
strong Stark
medium In Ordnung
simple Einfach
terrible Nasenficken(Freie Übersetzung)

(Übrigens ist diese Zeichenfolge im Code fest codiert, wenn die Datei "safe.Strength" instanziiert wird. Orz)

message ist eine Nachricht, die zeigt, warum sie so beurteilt wurde.

Diese Funktion gibt das Ergebnis korrekt zurück, wenn Sie eine Zeichenfolge übergeben, die beispielsweise in safe.is_asdf () mit einem Zeichen abgefangen werden kann.

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

Wenn Sie jedoch eine Zeichenfolge übergeben, die nicht in safe.is_asdf () mit einem Zeichen abgefangen wird, wird die von safe.is_by_step () gesendete Ausnahme ohne Behandlung ausgelöst.

>>> 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

Dies liegt daran, dass der Fehler zum Zeitpunkt der Zustandsprüfung nicht korrekt behandelt wird. safe.is_by_step () wird später beschrieben, aber wenn eine einstellige Zeichenfolge übergeben wird, wird eine IndexError-Ausnahme ausgelöst. Wenn safe.is_asdf () eine Nicht-True-Zeichenfolge ist (z. B. (), wird ein Zeichen ( an safe.is_by_step () übergeben.

    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

Es ist jedoch selten, dass eine einzelne Zeichenprüfung zulässig ist, sodass ich das Gefühl habe, nicht zu nervös sein zu müssen.

safe.is_asdf () - Bestimmen Sie, ob die Tastatur in der richtigen Reihenfolge ist

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

Legt fest, ob die angegebene Zeichenfolge in der Tastaturreihenfolge vorliegt. Die Reihenfolge hier ist die Zeichenfolge, die an den folgenden Stellen definiert ist. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L69 Daher werden nicht alle Tastaturordnungsmuster überprüft. (Ist es nicht etwas zu klein?)

Streit

raw ist die zu beurteilende Zeichenkette. Die durch "raw" angegebene Zeichenkette und die Zeichenkette, deren Reihenfolge umgekehrt ist, unterliegen einer Beurteilung. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L75

Rückgabewert

Bool-Wert. Gibt True zurück, wenn es in der Reihenfolge der Tastaturen liegt.

safe.is_by_step () - Bestimmen Sie, ob es sich um eine Shift-Code-ähnliche Zeichenfolge handelt

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

Die Shift-Verschlüsselung ist eine klassische und liebenswerte (aber nie verwendete) Verschlüsselungsmethode, die sich um n Zeichen verschiebt. Unter ihnen ist der Caesar-Code berühmt und verschiebt sich um 3 Zeichen. Wenn Sie beispielsweise die Zeichenfolge "test" um 3 Zeichen verschieben, erhalten Sie die Zeichenfolge "whvw". Solch eine Schnur ist im Handumdrehen gerissen, deshalb möchte ich sie nur verstecken und es hat nichts zu bedeuten. Diese Funktion bestimmt, ob es sich um eine solche Zeichenfolge handelt.

Der Abstand zwischen dem 1. und 0. Zeichen der angegebenen Zeichenfolge "raw" wird gemessen. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L89

Danach wird beurteilt, ob alle Zeichen entsprechend der Entfernung verschoben sind. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L91-L95

Wenn Sie eine Zeichenfolge der Länge 1 übergeben, wird IndexError gesendet.

>>> 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

Streit

raw ist die zu beurteilende Zeichenkette.

Rückgabewert

Der Bool-Wert. True, wenn es sich um eine Shift-Code-ähnliche Zeichenfolge handelt.

safe.is_common_password () - Bestimmen Sie, ob es sich um ein häufig verwendetes Kennwort handelt

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

Laut Docstring wird das allgemeine Passwort 1000 unter https://xato.net/passwords/more-top-worst-passwords/ verwendet, aber leider wurde diese URL nicht gefunden ( Hallo!!).

Das Paket enthält eine Liste häufig verwendeter Kennwörter. Diese Liste wird standardmäßig verwendet. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/words.dat

Diese Datei hat das folgende Format.

String-Frequenzpegel

Die häufige Ebene ist eine Ganzzahl, die zur Beurteilung verwendet wird. Je größer der Wert, desto häufiger wird sie verwendet.

Diese Datei kann auch eine benutzerdefinierte Datei sein. Wenn Sie in diesem Fall den Pfad der benutzerdefinierten Datei in der Umgebungsvariablen "PYTHON_SAFE_WORDS_FILE" angeben, wird dieser verwendet.

Die Daten in dieser Datei werden bei Verwendung als Diktat in der Form "{'string': integer, ...}" verwendet. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L58-L61

Danach wird das Diktat zwischengespeichert und der Speicherort der Cache-Datei kann durch die Umgebungsvariable "PYTHON_SAFE_WORDS_CACHE" angegeben werden.

Diese Daten lesen die Datei beim Importieren des sicheren Pakets und bewahren sie in safe.WORDS auf. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L68

Wenn "PYTHON_SAFE_WORDS_FILE" angegeben ist und die Datei nicht vorhanden ist, wird FileNotFoundError ausgelöst und der Import schlägt fehl (leicht schmerzhafte Angabe).

Streit

raw ist die zu beurteilende Zeichenkette. freq scheint ein häufig verwendetes Level zu sein. Je größer die Zahl, desto häufiger wird sie verwendet.

Rückgabewert

Der Bool-Wert. True für häufig verwendete Zeichenfolgen. False, wenn der Frequenzpegel kleiner oder gleich dem durch das Argument "freq" angegebenen Wert ist. Es ist auch falsch, wenn es nicht einer häufig verwendeten Zeichenfolge entspricht.

safe.safety () - Unveröffentlichte, aber öffentlich zugängliche Funktionen

safe.safety () ist eine Funktion, die nur safe.check () aufruft und ihren Rückgabewert zurückgibt. Der Unterschied zwischen den beiden ist der Standardwert des Arguments. safe.check () hat einen min_type von 3, während safe.safety () einen Wert von 2 hat. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L192-L193

Diese Funktion ist jedoch nicht in all enthalten. Und ich benutze es nicht im Paket. https://github.com/lepture/safe/blob/cb554022df8be8a4f7fa0b8fbee39639b4819495/safe/init.py#L20-L23 Wird es vergessen, es aufzunehmen, oder ist es nicht enthalten, weil der Autor beabsichtigt, es abzuschaffen (obwohl ich nicht möchte, dass Sie es so machen ...), ist es auf jeden Fall sicher, ohne diese Funktion zu verwenden Es scheint besser zu sein, .check () zu verwenden. (Übrigens schreibt dieser Autor all ziemlich gut in _compat.py, also riecht es so, als hätte ich vergessen, es zu schreiben.)

Nachwort

Diese Bibliothek ist eine kleine Bibliothek mit nur etwa 200 Zeilen. Es wurde einfach gemacht, also schien es sehr einfach zu bedienen zu sein. Ich habe ungefähr 2 Stunden damit verbracht, diesen Artikel zu schreiben. -> Ungefähr 100 Zeilen pro Stunde

Recommended Posts

Codelesen von Safe, einer Bibliothek zur Überprüfung der Kennwortstärke in Python
Code lesen von m3u8, einer Bibliothek zum Bearbeiten von m3u8-Dateien im HLS-Videoformat mit Python
Code zum Überprüfen des Betriebs von Python Matplot lib
Kann mit AtCoder verwendet werden! Eine Sammlung von Techniken zum Zeichnen von Kurzcode in Python!
Wettbewerb mit VS-Code Erstellen Sie eine Python-Umgebung für Profis unter Windows
Wrap (Teil der) AtCoder Library in Cython zur Verwendung in Python
Eine kurze Zusammenfassung von Graphviz in Python (nur für Mac erklärt)
Zeigen Sie eine Liste der Alphabete in Python 3 an
Holen Sie sich ein Zeichen für Conoha mit Python
Ein Tool zur einfachen Eingabe von Python-Code
Ich habe ein Passwort-Tool in Python erstellt.
[DSU] Lesen der AtCoder-Bibliothek mit Green Coder ~ Implementierung in Python ~
Python-Code zur Bestimmung der monatlichen Signale für Investitionen mit relativer Stärke
Zeichnen Sie in Python ein Diagramm einer quadratischen Funktion
Holen Sie sich den Aufrufer einer Funktion in Python
Kopieren Sie die Liste in Python
Umschreiben von Elementen in einer Listenschleife (Python)
Machen Sie mit Python eine Joyplot-ähnliche Handlung von R.
Ausgabe in Form eines Python-Arrays
Lassen Sie uns einen Teil des maschinellen Lernens mit Python berühren
Einstellungen für die Python-Codierung mit Visual Studio-Code
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Grundlegende Geschichte der Vererbung in Python (für Anfänger)
Spezifischer Beispielcode für die Arbeit mit SQLite3 in Python
Ein Memorandum beim Schreiben von experimentellem Code ~ Anmelden in Python
VS-Code-Einstellungen für die Entwicklung in Python mit Abschluss
Versuchen Sie, in Python nach einem Profil mit einer Million Zeichen zu suchen
Ruby, Python-Codefragment Ausführung der Auswahl in Emacs
Python: Ruft eine Liste der Methoden für ein Objekt ab
Gruppieren Sie nach aufeinanderfolgenden Elementen einer Liste in Python
Zeigen Sie ein Histogramm der Bildhelligkeitswerte in Python an
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Stellen Sie settings.json für eine effiziente Python-Codierung mit VS-Code bereit
[Python] Code zur Messung des Umgebungslichts RGB von APDS9960
Veröffentlichen / Hochladen einer in Python erstellten Bibliothek in PyPI
Proxy für Python-Pip festlegen (beschrieben in pip.ini)
Super einfacher Fall k-means Methode Python-Code
Csv spuckte eine Liste mit Dateinamen, zuletzt geänderten Daten und Zeichencodes in Python3 aus
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus
Überprüfen Sie die Funktionsweise von Python für .NET in jeder Umgebung
Erstellen Sie eine Multiplikationstabelle für jedes Element in einer Tabelle (Python).
Erstellen Sie ein untergeordnetes Konto für die Verbindung mit Stripe in Python
[Für Anfänger] Zusammenfassung der Standardeingabe in Python (mit Erklärung)
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
Vergleich des in Python geschriebenen EMA-Codes (Exponential Moving Average)
Erstellen einer Entwicklungsumgebung für Android-Apps - Erstellen von Android-Apps mit Python
Eine einfache Möglichkeit, mehrere for-Schleifen in Python zu vermeiden
Entwickelte eine Bibliothek, um die Kindle-Sammlungsliste in Python abzurufen
So definieren Sie mehrere Variablen in einer Python for-Anweisung
So entwickeln Sie in einer virtuellen Python-Umgebung [Memo]
Machen Sie so etwas wie einen Python-Interpreter mit Visual Studio Code
Ein Beispiel zum Zeichnen von Punkten mit PIL (Python Imaging Library).
[Hinweis] Import von Dateien in das übergeordnete Verzeichnis in Python
Entschlüsseln Sie eine Codezeile in Python Lambda, Karte, Liste
Erstellen Sie den Code, der in Python "A und vorgeben B" ausgibt
Versuchen Sie, ein neuronales Netzwerk in Python aufzubauen, ohne eine Bibliothek zu verwenden
So erhalten Sie eine Liste der integrierten Ausnahmen für Python