Skip to main content
edited tags
Link
Reinderien
  • 71.1k
  • 5
  • 76
  • 256
Tweeted twitter.com/StackCodeReview/status/1279746854914318337
added 9 characters in body; edited tags
Source Link
Peilonrayz
  • 44.6k
  • 7
  • 80
  • 158

DecidedI decided to make a password generator to get more familiar with pythonPython.

I had to break up the code into two boxes due to weird StackExchangeStack Exchange highlighting with the triple quotes.

Readability/cleanness,

Performance,

Security.

  • Readability/cleanness,
  • Performance, and
  • Security.
import string
import random
import secrets
import argparse
import MyFormatter

alphaL = list(string.ascii_lowercase)
alphaU = list(string.ascii_uppercase)
numeric = list(string.digits)
special = list("!@#$%^&*")
special2 = list("""~`!@#$%^&*()+=_-{}[]\|:;"'?/<>,.""")
  
parser = argparse.ArgumentParser(
    formatter_class=MyFormatter.MyFormatter,
    description="Generates a password",
    usage="",
)

parser.add_argument("-lc", "--lower", type=int, default=1, help="Minimum number of lowercase alpha characters")
parser.add_argument("-uc", "--upper", type=int, default=1, help="Minimum number of uppercase alpha characters")
parser.add_argument("-n", "--numeric", type=int, default=1, help="Minimum number of numeric characters")
parser.add_argument("-s", "--special", type=int, default=1, help="Minimum number of special characters")
parser.add_argument("-se", "--extended", action = 'store_const', default = False, const= True, help="Toggles the extendard special character subset. Passwords may not be accepted by all services")
parser.add_argument("-l", "--length", type=int, default=20, help="Length of the generated password")

args = parser.parse_args()

length = args.length

minimums = [
    args.lower,
    args.upper,
    args.numeric,
    args.special,
]

password = ""

for i in range(0, minimums[0]) :
    password += secrets.choice(alphaL)
    
for i in range(0, minimums[1]) :
    password += secrets.choice(alphaU)

for i in range(0, minimums[2]) :
    password += secrets.choice(numeric)

if args.extended :
    subset = alphaL + alphaU + numeric + special2
    for i in range(0, minimums[3]) :
        password += secrets.choice(special2)
elif minimums[3] :
    subset = alphaL + alphaU + numeric + special
    for i in range(0, minimums[3]) :
        password += secrets.choice(special)

for i in range(0, 100) :
    random.shuffle(subset)
            
for i in range(len(password), length) :
    password += secrets.choice(subset)

for i in range(0, 100) :
    password = ''.join(random.sample(password, len(password)))

print("Password: ", password)
```

Decided to make a password generator to get more familiar with python.

I had to break up the code into two boxes due to weird StackExchange highlighting with the triple quotes.

Readability/cleanness,

Performance,

Security.

import string
import random
import secrets
import argparse
import MyFormatter

alphaL = list(string.ascii_lowercase)
alphaU = list(string.ascii_uppercase)
numeric = list(string.digits)
special = list("!@#$%^&*")
special2 = list("""~`!@#$%^&*()+=_-{}[]\|:;"'?/<>,.""")
 parser = argparse.ArgumentParser(
    formatter_class=MyFormatter.MyFormatter,
    description="Generates a password",
    usage="",
)

parser.add_argument("-lc", "--lower", type=int, default=1, help="Minimum number of lowercase alpha characters")
parser.add_argument("-uc", "--upper", type=int, default=1, help="Minimum number of uppercase alpha characters")
parser.add_argument("-n", "--numeric", type=int, default=1, help="Minimum number of numeric characters")
parser.add_argument("-s", "--special", type=int, default=1, help="Minimum number of special characters")
parser.add_argument("-se", "--extended", action = 'store_const', default = False, const= True, help="Toggles the extendard special character subset. Passwords may not be accepted by all services")
parser.add_argument("-l", "--length", type=int, default=20, help="Length of the generated password")

args = parser.parse_args()

length = args.length

minimums = [
    args.lower,
    args.upper,
    args.numeric,
    args.special,
]

password = ""

for i in range(0, minimums[0]) :
    password += secrets.choice(alphaL)
    
for i in range(0, minimums[1]) :
    password += secrets.choice(alphaU)

for i in range(0, minimums[2]) :
    password += secrets.choice(numeric)

if args.extended :
    subset = alphaL + alphaU + numeric + special2
    for i in range(0, minimums[3]) :
        password += secrets.choice(special2)
elif minimums[3] :
    subset = alphaL + alphaU + numeric + special
    for i in range(0, minimums[3]) :
        password += secrets.choice(special)

for i in range(0, 100) :
    random.shuffle(subset)
            
for i in range(len(password), length) :
    password += secrets.choice(subset)

for i in range(0, 100) :
    password = ''.join(random.sample(password, len(password)))

print("Password: ", password)
```

I decided to make a password generator to get more familiar with Python.

I had to break up the code into two boxes due to weird Stack Exchange highlighting with the triple quotes.

  • Readability/cleanness,
  • Performance, and
  • Security.
import string
import random
import secrets
import argparse
import MyFormatter

alphaL = list(string.ascii_lowercase)
alphaU = list(string.ascii_uppercase)
numeric = list(string.digits)
special = list("!@#$%^&*")
special2 = list("""~`!@#$%^&*()+=_-{}[]\|:;"'?/<>,.""")
 
parser = argparse.ArgumentParser(
    formatter_class=MyFormatter.MyFormatter,
    description="Generates a password",
    usage="",
)

parser.add_argument("-lc", "--lower", type=int, default=1, help="Minimum number of lowercase alpha characters")
parser.add_argument("-uc", "--upper", type=int, default=1, help="Minimum number of uppercase alpha characters")
parser.add_argument("-n", "--numeric", type=int, default=1, help="Minimum number of numeric characters")
parser.add_argument("-s", "--special", type=int, default=1, help="Minimum number of special characters")
parser.add_argument("-se", "--extended", action = 'store_const', default = False, const= True, help="Toggles the extendard special character subset. Passwords may not be accepted by all services")
parser.add_argument("-l", "--length", type=int, default=20, help="Length of the generated password")

args = parser.parse_args()

length = args.length

minimums = [
    args.lower,
    args.upper,
    args.numeric,
    args.special,
]

password = ""

for i in range(0, minimums[0]) :
    password += secrets.choice(alphaL)
    
for i in range(0, minimums[1]) :
    password += secrets.choice(alphaU)

for i in range(0, minimums[2]) :
    password += secrets.choice(numeric)

if args.extended :
    subset = alphaL + alphaU + numeric + special2
    for i in range(0, minimums[3]) :
        password += secrets.choice(special2)
elif minimums[3] :
    subset = alphaL + alphaU + numeric + special
    for i in range(0, minimums[3]) :
        password += secrets.choice(special)

for i in range(0, 100) :
    random.shuffle(subset)
            
for i in range(len(password), length) :
    password += secrets.choice(subset)

for i in range(0, 100) :
    password = ''.join(random.sample(password, len(password)))

print("Password: ", password)
Source Link

Password Generator Python

Decided to make a password generator to get more familiar with python.

I had to break up the code into two boxes due to weird StackExchange highlighting with the triple quotes.

How would you improve this program on the grounds of:

Readability/cleanness,

Performance,

Security.

Feel free to include any other comments you have on it that may not fit into those three categories.

import string
import random
import secrets
import argparse
import MyFormatter

alphaL = list(string.ascii_lowercase)
alphaU = list(string.ascii_uppercase)
numeric = list(string.digits)
special = list("!@#$%^&*")
special2 = list("""~`!@#$%^&*()+=_-{}[]\|:;"'?/<>,.""")
parser = argparse.ArgumentParser(
    formatter_class=MyFormatter.MyFormatter,
    description="Generates a password",
    usage="",
)

parser.add_argument("-lc", "--lower", type=int, default=1, help="Minimum number of lowercase alpha characters")
parser.add_argument("-uc", "--upper", type=int, default=1, help="Minimum number of uppercase alpha characters")
parser.add_argument("-n", "--numeric", type=int, default=1, help="Minimum number of numeric characters")
parser.add_argument("-s", "--special", type=int, default=1, help="Minimum number of special characters")
parser.add_argument("-se", "--extended", action = 'store_const', default = False, const= True, help="Toggles the extendard special character subset. Passwords may not be accepted by all services")
parser.add_argument("-l", "--length", type=int, default=20, help="Length of the generated password")

args = parser.parse_args()

length = args.length

minimums = [
    args.lower,
    args.upper,
    args.numeric,
    args.special,
]

password = ""

for i in range(0, minimums[0]) :
    password += secrets.choice(alphaL)
    
for i in range(0, minimums[1]) :
    password += secrets.choice(alphaU)

for i in range(0, minimums[2]) :
    password += secrets.choice(numeric)

if args.extended :
    subset = alphaL + alphaU + numeric + special2
    for i in range(0, minimums[3]) :
        password += secrets.choice(special2)
elif minimums[3] :
    subset = alphaL + alphaU + numeric + special
    for i in range(0, minimums[3]) :
        password += secrets.choice(special)

for i in range(0, 100) :
    random.shuffle(subset)
            
for i in range(len(password), length) :
    password += secrets.choice(subset)

for i in range(0, 100) :
    password = ''.join(random.sample(password, len(password)))

print("Password: ", password)
```