Update password_generator.py (#7745)

* Update password_generator.py

1. Use secrets module instead of random for passwords as it gives a secure source of randomness
2. Add type annotations for functions
3. Replace ctbi (variable for the characters to be included) with a more meaningful and short name
4. Use integer division instead of obtaining the integer part of a division computing a floating point

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Pronoy Mandal 2022-10-29 18:24:13 +05:30 committed by GitHub
parent b0f68a0248
commit 18ffc4dec8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,9 +1,10 @@
"""Password Generator allows you to generate a random password of length N.""" """Password Generator allows you to generate a random password of length N."""
from random import choice, shuffle import secrets
from random import shuffle
from string import ascii_letters, digits, punctuation from string import ascii_letters, digits, punctuation
def password_generator(length=8): def password_generator(length: int = 8) -> str:
""" """
>>> len(password_generator()) >>> len(password_generator())
8 8
@ -17,58 +18,59 @@ def password_generator(length=8):
0 0
""" """
chars = ascii_letters + digits + punctuation chars = ascii_letters + digits + punctuation
return "".join(choice(chars) for x in range(length)) return "".join(secrets.choice(chars) for _ in range(length))
# ALTERNATIVE METHODS # ALTERNATIVE METHODS
# ctbi= characters that must be in password # chars_incl= characters that must be in password
# i= how many letters or characters the password length will be # i= how many letters or characters the password length will be
def alternative_password_generator(ctbi, i): def alternative_password_generator(chars_incl: str, i: int) -> str:
# Password Generator = full boot with random_number, random_letters, and # Password Generator = full boot with random_number, random_letters, and
# random_character FUNCTIONS # random_character FUNCTIONS
# Put your code here... # Put your code here...
i = i - len(ctbi) i -= len(chars_incl)
quotient = int(i / 3) quotient = i // 3
remainder = i % 3 remainder = i % 3
# chars = ctbi + random_letters(ascii_letters, i / 3 + remainder) + # chars = chars_incl + random_letters(ascii_letters, i / 3 + remainder) +
# random_number(digits, i / 3) + random_characters(punctuation, i / 3) # random_number(digits, i / 3) + random_characters(punctuation, i / 3)
chars = ( chars = (
ctbi chars_incl
+ random(ascii_letters, quotient + remainder) + random(ascii_letters, quotient + remainder)
+ random(digits, quotient) + random(digits, quotient)
+ random(punctuation, quotient) + random(punctuation, quotient)
) )
chars = list(chars) list_of_chars = list(chars)
shuffle(chars) shuffle(list_of_chars)
return "".join(chars) return "".join(list_of_chars)
# random is a generalised function for letters, characters and numbers # random is a generalised function for letters, characters and numbers
def random(ctbi, i): def random(chars_incl: str, i: int) -> str:
return "".join(choice(ctbi) for x in range(i)) return "".join(secrets.choice(chars_incl) for _ in range(i))
def random_number(ctbi, i): def random_number(chars_incl, i):
pass # Put your code here... pass # Put your code here...
def random_letters(ctbi, i): def random_letters(chars_incl, i):
pass # Put your code here... pass # Put your code here...
def random_characters(ctbi, i): def random_characters(chars_incl, i):
pass # Put your code here... pass # Put your code here...
def main(): def main():
length = int(input("Please indicate the max length of your password: ").strip()) length = int(input("Please indicate the max length of your password: ").strip())
ctbi = input( chars_incl = input(
"Please indicate the characters that must be in your password: " "Please indicate the characters that must be in your password: "
).strip() ).strip()
print("Password generated:", password_generator(length)) print("Password generated:", password_generator(length))
print( print(
"Alternative Password generated:", alternative_password_generator(ctbi, length) "Alternative Password generated:",
alternative_password_generator(chars_incl, length),
) )
print("[If you are thinking of using this passsword, You better save it.]") print("[If you are thinking of using this passsword, You better save it.]")