рдкрд╛рд╕рд╡рд░реНрдб рдЬрдирд░реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛

рдкрд╛рд╕рд╡рд░реНрдб рдиреАрддрд┐


рд░рд╛рдЬрдиреАрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдХреЗ рдкрд╛рд╕рд╡рд░реНрдб


рдореБрдЭреЗ рдпрд╣ рдорд╣рд╕реВрд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкрд╛рдБрдЪ рдмрд╛рд░ рдкрд╛рд╕рд╡рд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рд▓рд┐рдЦрд╛ рд╣реИред рдФрд░ рдЙрд╕рдиреЗ рд╣рд░ рдмрд╛рд░ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ред рдФрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЛрдИ рдЬрдЯрд┐рд▓ рдХреЛрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдмрд╕ рдПрдХ рд╕рд░рд▓ рдирдП рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдЬреЛ рдХрд▓ рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдпрд╛ рдерд╛ред


рдЪрд▓реЛ рд╕рд░рд▓ рдкрд╛рд╕рд╡рд░реНрдб рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:


  • рдордирдорд╛рдиреА рд▓рдВрдмрд╛рдИ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдХрд┐рд╕реА рднреА рдореБрджреНрд░рд┐рдд рд╡рд░реНрдгреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

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)

рд╣рдо рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ:


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

рдЦреИрд░, рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдХрд╛рдо рдХреЗ рджрд┐рди рдХреЗ рдЕрдВрдд рддрдХ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рддрд╕реНрд╡реАрд░реЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдЪрд╛рдирдХ рд░рд╛рдЬрдиреАрддрд┐


, , MyDB . , :


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

, . :


  • , , -
  • ,


рдареАрдХ рд╣реИ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрдЯрд┐рд▓ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ generate_random_stringрдЬреЛ рдмрд╕ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реИрдВрдбрдо рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред


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)

рддреЛ рдЪрд▓реЛ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:


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

рдорд╣рд╛рди, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред


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

рдпрд╣ рдХреЗрд╡рд▓ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:


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

рд╕рдВрдкреВрд░реНрдг


рд╣рдордиреЗ рдПрдХ рдЖрд╕рд╛рди-рд╕реЗ-рд╕рдордЭрджрд╛рд░ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрд╛рдлреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд╛рд╕рд╡рд░реНрдб рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦрд╛, рдФрд░ рдХрд╛рд░реНрдп рджрд┐рд╡рд╕ рдХреЗ рдЕрдВрдд рддрдХ рдЕрднреА рднреА рдмрд╣реБрдд рд╕рдордп рд╣реИред рдпрджрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреЛрдИ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рд╣реИ random, рддреЛ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред


рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles