Python - 具有复杂性要求的密码生成

问题描述 投票:0回答:4

我需要为我公司的 20 万多个客户生成随机密码。

密码复杂性要求是常见的:

  1. 长度>8
  2. 至少包含一个大写字符
  3. 至少包含一个小写字符
  4. 至少包含一个数字
  5. 至少包含一个符号(例如@#$%)

这是我用来按照 Google 搜索结果上的指南生成随机密码字符串的 python 3.8 代码(如 thisthis):

import secrets
import string

def getRandomPasswordString(length):
    
    alphabet = string.ascii_letters + string.digits + string.punctuation
    password = ''.join(secrets.choice(alphabet) for i in range(length))

    return password

这在大多数情况下都可以正常工作,但在极少数情况下,生成的密码不符合复杂性要求,如下所示:

=Y[&PE-XXP[//F,(缺少小写字母)

^f~+""uwan]ny)b(缺少大写字母)

AQvoMApuNFyRkJd(缺少符号和数字)

我知道我可以做这样的事情来确保选择每种类型的角色:

import secrets
import string

def getRandomPasswordString(length):
    
    alphabet = string.ascii_letters + string.digits + string.punctuation

    password = secrets.choice(string.ascii_uppercase) + \
            secrets.choice(string.ascii_lowercase) + \
            secrets.choice(string.digits) + \
            secrets.choice(string.punctuation) + \
            ''.join(secrets.choice(alphabet) for i in range(length-4))

    return password

这工作正常,但我不确定在前 4 个字符中强加一些密码模式是否会导致任何问题(即模式是大写>小写>数字>符号)

因此,我想探索是否有任何干净的、一行/更短的解决方案来生成所需的密码。

提前非常感谢

python python-3.x random passwords
4个回答
2
投票

我更喜欢让生成的密码稍微复杂一些。您可以更改 if 语句中的上限、下限、标点符号或数字的数量变化:

    import string
    import secrets


    opts = string.ascii_letters + string.digits + string.punctuation
    #Generate a random password with at least two lower case, two upper case, one digit, and two symbols
    while True:
        psswd = ''.join(secrets.choice(opts) for i in range(12))
        if (sum(c.islower() for c in psswd) >=2 and
            sum(c.isupper() for c in psswd) >=2 and
            sum(c in string.punctuation for c in psswd) >=2 and
            any(c.isdigit() for c in psswd) ):
            break
    return psswd

1
投票

只需在最后添加以下内容即可打乱生成的密码:

password = "".join(random.sample(password,len(password)))

这样您无需创建模式即可满足要求。

或者你可以打乱需求并编写这样的函数:

from random  import sample
from secrets import choice
from string  import *

def getRandomPassword(length):
    alphabet      = ascii_letters + digits + punctuation
    requirements  = [ascii_uppercase,        # at least one uppercase letter
                     ascii_lowercase,        # at least one lowercase letter
                     digits,                 # at least one digit
                     punctuation,            # at least one symbol
                     *(length-4)*[alphabet]] # rest: letters digits and symbols
    return "".join(choice(req) for req in sample(requirements,length)) 

1
投票
import random
import string

def get_random_string(length):
    letters = string.ascii_letters + string.digits + string.punctuation
    result_str = ''.join(random.choice(letters) for i in range(length))
    print("Random string of length", length, "is:", result_str)

get_random_string(8)
get_random_string(8)
get_random_string(6)
get_random_string(11)
get_random_string(22)

1
投票

对于任何想要更简单的东西的人来说,您可以使用

faker
包。有一种方法
.password()
您可以向其提供参数,以使您的密码或多或少复杂。

显然,安装

faker
pip install faker

然后,只需3行代码:

from faker import Faker
fake = Faker()
print(fake.password())

这将输出一个长度为 10 的字符串,这些是您可以使用的默认参数:

password(length=10, special_chars=True, digits=True, upper_case=True, lower_case=True)

这只是我终端中的简单运行:

from faker import Faker
fake = Faker()
fake.password()
'S9tBRdbf^C'
fake.password()
'NWN8FB4ku&'
fake.password()
'*0B7Z_TisD'
fake.password()
'L2R_bTkw_^'

如有疑问,请随时发表评论。

© www.soinside.com 2019 - 2024. All rights reserved.