Skip to content

Instantly share code, notes, and snippets.

@iKunalChhabra
Created March 22, 2023 10:02
Show Gist options
  • Save iKunalChhabra/fafa05a51a93b0053428d38c2c3ff0f9 to your computer and use it in GitHub Desktop.
Save iKunalChhabra/fafa05a51a93b0053428d38c2c3ff0f9 to your computer and use it in GitHub Desktop.
Generate a random password
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