
Passwörter aus der Politik
Ich hatte das Gefühl, dass ich bereits fünf Mal eine Funktion zum Generieren von Passwörtern geschrieben habe. Und er hat es jedes Mal anders gemacht. Der Grund dafür sind die unterschiedlichen Passwortanforderungen für verschiedene Projekte und Tools. Es wird keinen komplexen Code geben, nur eine Zusammenfassung einer einfachen neuen Lösung, die mir gestern gekommen ist.
Beginnen wir mit einfachen Passwortanforderungen:
- muss beliebig lang sein
- muss aus gedruckten Zeichen bestehen
import string
import random
from typing import List
def generate_password(length: int) -> str:
"""
Generate a password of a given `length`.
"""
result: List[str] = []
choices = string.printable
while len(result) < length:
symbol = random.choice(string.printable)
result.append(symbol)
return "".join(result)
Wir versuchen:
>>> generate_password(8)
... "1{k]/2)h"
>>> generate_password(13)
... "9ar|&:a+U]Il$"
Nun, die Aufgabe ist erledigt, wir können bis zum Ende des Arbeitstages Bilder mit Katzen ansehen.
Plötzliche Politik
, , MyDB . , :
, . :
Okay, das ist schon kompliziert, also fangen wir mit einer Funktion an generate_random_string
, die einfach zufällige Zeichenfolgen aus dem, was sie gegeben haben, generiert.
import string
import random
from typing import List
def generate_random_string(length: int, *choices: str) -> str:
"""
Generate a string of a given `length`.
The result has at least one symbol from each of `choices` if `length` allows.
Arguments:
length -- Result string length.
choices -- Strings with available symbols.
"""
if not choices:
choices = (string.ascii_letters, )
all_choices = "".join(choices)
result: List[str] = []
choice_index = 0
while len(result) < length:
if choice_index < len(choices):
symbol = random.choice(choices[choice_index])
result.append(symbol)
choice_index += 1
continue
symbol = random.choice(all_choices)
result.append(symbol)
random.shuffle(result)
return "".join(result)
Lass es uns versuchen:
>>>
>>> generate_random_string(8, string.digits)
... "59197550"
>>>
>>> generate_random_string(8, string.ascii_letters, "!")
... "vIOWXN!o"
Großartig, es ist Zeit, ein Passwort zu generieren, das alle unsere Anforderungen erfüllt.
def generate_mydb_password(length: int) -> str:
"""
Generate a random password for MyDB of a given `length`.
The result has at least:
- one uppercase letter
- one lowercase letter
- one digit
- one special character
Raises:
ValueError -- If `length` is lesser than 8.
"""
if length < 8:
raise ValueError("Password length should be at least 8")
return generate_random_string(
length,
string.ascii_uppercase,
string.ascii_lowercase,
string.digits,
"!&?",
)
Es bleibt nur zu überprüfen:
>>> generate_mydb_password(8)
... "P?P1&7zL"
>>> generate_mydb_password(13)
... "tR!QslK!Sl7EO"
>>> generate_mydb_password(2)
... ValueError: Password length should be at least 8
Gesamt
Wir haben einen leicht verständlichen und gleichzeitig eher zufälligen Passwortgenerator geschrieben, und bis zum Ende des Arbeitstages bleibt noch viel Zeit. Wenn der Bibliothek kein Vertrauen entgegengebracht wird random
, können Sie sie durch die gewünschte Bibliothek ersetzen.
Vielen Dank für Ihre Aufmerksamkeit!