Menulis ulang penghasil kata sandi

Kebijakan kata sandi


Kata sandi keluar dari politik


Saya merasa bahwa saya telah menulis fungsi untuk menghasilkan kata sandi lima kali. Dan dia melakukannya secara berbeda setiap waktu. Dan alasannya adalah persyaratan kata sandi yang berbeda untuk berbagai proyek dan alat. Tidak akan ada kode yang rumit, hanya ringkasan dari solusi baru sederhana yang datang kepada saya kemarin.


Mari kita mulai dengan persyaratan kata sandi sederhana:


  • harus panjang sewenang-wenang
  • harus terdiri dari karakter yang dicetak

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)

Kita coba:


>>> generate_password(8)
... "1{k]/2)h"
>>> generate_password(13)
... "9ar|&:a+U]Il$"

Nah, tugas selesai, kita bisa menonton gambar dengan kucing sampai akhir hari kerja.


Politik mendadak


, , MyDB . , :


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

, . :


  • , , -
  • ,


Oke, ini sudah rumit, jadi mari kita mulai dengan fungsi generate_random_stringyang hanya akan menghasilkan string acak dari apa yang mereka berikan.


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)

Jadi, mari kita coba:


>>> #    
>>> generate_random_string(8, string.digits)
... "59197550"
>>> #       
>>> generate_random_string(8, string.ascii_letters, "!") 
... "vIOWXN!o"

Hebat, saatnya untuk benar-benar menghasilkan kata sandi yang memenuhi semua persyaratan kami.


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, #  
        "!&?", #  -,    
    )

Tinggal memeriksa:


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

Total


Kami menulis penghasil kata sandi yang mudah dimengerti dan sekaligus acak, dan masih ada banyak waktu hingga akhir hari kerja. Jika tidak ada kepercayaan di perpustakaan random, maka Anda bisa menggantinya dengan yang Anda suka.


Terimakasih atas perhatiannya!

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


All Articles