Created
March 22, 2023 10:02
-
-
Save iKunalChhabra/fafa05a51a93b0053428d38c2c3ff0f9 to your computer and use it in GitHub Desktop.
Generate a random password
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import string | |
import secrets | |
class PasswordGenerator: | |
""" | |
Generate a random password with the following parameters: | |
:param length: Length of the password | |
:param min_digits: Minimum number of digits in the password | |
:param min_uppercase: Minimum number of uppercase letters in the password | |
:param min_lowercase: Minimum number of lowercase letters in the password | |
:param min_punctuation: Minimum number of punctuation characters in the password | |
:return: Random password | |
Example: | |
password_generator = PasswordGenerator(length=16, | |
min_digits=2, | |
min_uppercase=2, | |
min_lowercase=2, | |
min_punctuation=2) | |
print(password_generator.generate_password()) | |
Output: | |
4i8UhT#U5_}i<d1+ | |
""" | |
def __init__(self, | |
length=8, | |
min_digits=1, | |
min_uppercase=1, | |
min_lowercase=1, | |
min_punctuation=1): | |
self.__length = length | |
self.__min_digits = min_digits | |
self.__min_uppercase = min_uppercase | |
self.__min_lowercase = min_lowercase | |
self.__min_punctuation = min_punctuation | |
self.__check_length() | |
def __check_length(self): | |
if self.__length < (self.__min_digits + self.__min_uppercase + self.__min_lowercase + self.__min_punctuation): | |
raise ValueError('Length of password is less than the sum of minimum digits, uppercase, lowercase and punctuation') | |
def __get_digits(self): | |
return [secrets.choice(string.digits) for _ in range(self.__min_digits)] | |
def __get_uppercase(self): | |
return [secrets.choice(string.ascii_uppercase) for _ in range(self.__min_uppercase)] | |
def __get_lowercase(self): | |
return [secrets.choice(string.ascii_lowercase) for _ in range(self.__min_lowercase)] | |
def __get_punctuation(self): | |
return [secrets.choice(string.punctuation) for _ in range(self.__min_punctuation)] | |
def __get_remaining_char(self): | |
remaining_char_length = self.__length - (self.__min_digits + self.__min_uppercase + self.__min_lowercase + self.__min_punctuation) | |
all_chars = string.ascii_letters + string.digits + string.punctuation | |
return [secrets.choice(all_chars) for _ in range(remaining_char_length)] | |
def __generate_password(self): | |
password = self.__get_digits() \ | |
+ self.__get_uppercase() \ | |
+ self.__get_lowercase() \ | |
+ self.__get_punctuation() \ | |
+ self.__get_remaining_char() | |
shuffled_password = secrets.SystemRandom().sample(password, len(password)) | |
return ''.join(shuffled_password) | |
def generate_password(self): | |
random_passwords = [self.__generate_password() for _ in range(10)] | |
return secrets.choice(random_passwords) | |
def __str__(self): | |
return f"PasswordGenerator(length={self.__length}, min_digits={self.__min_digits}, min_uppercase={self.__min_uppercase}, min_lowercase={self.__min_lowercase}, min_punctuation={self.__min_punctuation})" | |
def __repr__(self): | |
return self.__str__() | |
if __name__ == '__main__': | |
password_generator = PasswordGenerator(length=16, | |
min_digits=2, | |
min_uppercase=2, | |
min_lowercase=2, | |
min_punctuation=2) | |
print(password_generator.generate_password()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment