[英]random password does not choose every condition that user choose
我想制作一个密码生成器我让用户选择大写,数字和符号,但是当我的代码从短语中选择随机密码时,随机部分有问题根据用户选择的条件,其中一个条件可能不是履行。 例如,所有选择的短语可能都是小写的,但用户已经激活了大写条件
import string
import secrets
def random_password_generator(upper=True, digits=True, symbols=False, length=12):
a_l = string.ascii_lowercase
a_u = string.ascii_uppercase
phrase = a_l
if upper:
phrase += a_u
if digits:
phrase += string.digits
if symbols:
phrase += string.punctuation
password = ''.join(secrets.choice(phrase) for i in range(length))
return password
a = random_password_generator()
print(a)
secrets.choice(phrase) 从你给它的短语中选择一个随机字符。 您执行该操作 10 次。 无法保证在这 10 次中,随机选择将属于您添加到短语中的任何类别。
password = ''.join(secrets.choice(phrase) for i in range(10))
您正在从phrase
中选择十个随机字母。
即使phrase
包含大写字母作为可能的选择,也不能保证随机选择实际上包含任何大写字母。 它可能只是随机选择所有小写字母。
数字和符号也一样。
另外,你为什么选择十个字母? 您忽略了length
参数。
取输入长度并将其划分为符号类别。 从该类别中随机 select 字符和 append 到密码。 最后,随机打乱密码的所有字符。
可以根据您选择的一些权重和硬编码来将输入长度划分为类别。
例如,如果您要分配以下权重,
类别 | 重量 |
---|---|
上 | 5 |
降低 | 5 |
数字 | 3 |
符号 | 2 |
然后,您可以决定每个类别使用多少个字符。 例如,如果他们要求长度为 12,包括大写、小写和数字。 大写、小写和数字的总权重为 5 + 5 + 3 = 13,因此 max(( 5 / 13 ) * 12, 1) = 4 个字符应为大写等。
您决定是否应包含符号的 function 参数称为symbols
。 但是,您随后将string.punctuation
分配给具有相同名称的变量。
这意味着,以下 if 语句if symbol:
实际上与if string.punctuation
相同,它始终解析为True
,无论您的 symbol 参数在 string.punctuation 分配给它之前携带的 boolean 值是什么。
这是您的代码的固定版本:
import string
import secrets
def random_password_generator(upper=True, digits=True, include_symbols=False, length=12):
a_l = string.ascii_lowercase
a_u = string.ascii_uppercase
all_symbols = string.punctuation # make sure this is a different variable
phrase = a_l
if upper:
phrase += a_u
if digits:
phrase += string.digits
if include_symbols:
phrase += all_symbols
password = ''.join(secrets.choice(phrase) for i in range(10))
return password
a = random_password_generator()
print(a)
我希望这是可以理解的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.