Umschreiben des Passwortgenerators

Kennwortrichtlinie


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 . , :


  • 8
  • - (!&? )
  • , bash-

, . :


  • , , -
  • ,


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!

Source: https://habr.com/ru/post/undefined/


All Articles