
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 . , :
, . :
Oke, ini sudah rumit, jadi mari kita mulai dengan fungsi generate_random_string
yang 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!