【问题标题】:How to generate random password in python [duplicate]如何在python中生成随机密码[重复]
【发布时间】:2021-04-17 17:08:43
【问题描述】:

我想使用python3生成随机密码来加密我的文件,创建的随机密码应该有以下限制

  1. 最小长度应为 12
  2. 必须包含一个大写字母。
  3. 必须包含一个小写字母。
  4. 必须包含一位数字。
  5. 必须包含一个特殊字符。

其实我不太了解在python 中生成随机事物有限制,所以我没有任何代码可以在这里展示。

【问题讨论】:

  • 这能回答你的问题吗? Generate password in python
  • @OliverF 不先生,这没有帮助,因为答案没有考虑随机生成中的特殊字符。
  • 好的,我的回答应该会有所帮助。
  • 骗子涵盖了你所需要的。只需添加更多代码以包含特殊字符。您可以从所有这些中创建 1 个随机上、1 个随机下、1 个随机数字、1 个随机特殊和 8 个其他随机,将这 12 个组合并随机排列以使它们随机定位。

标签: python python-3.x passwords


【解决方案1】:

您可以使用 python secrets 库从列表中选择一个字符。这是一个例子:

import string
import secrets

symbols = ['*', '%', '£'] # Can add more

password = ""
for _ in range(9):
    password += secrets.choice(string.ascii_lowercase)
password += secrets.choice(string.ascii_uppercase)
password += secrets.choice(string.digits)
password += secrets.choice(symbols)
print(password)

【讨论】:

  • 你不应该使用random 模块,它的伪随机性很适合测试,但对于这个目的来说非常弱。改用内置的secrets 模块
  • 感谢您的安全说明,我已经修正了答案。
【解决方案2】:

您可以生成随机位,将它们转换为整数,将它们固定,这样它就不会选择奇怪的字符并将它们转换为字符

 import random
 
  passwrd = ''
  length = 12
  for _ in range(length):
      bits = random.getrandbits(8)
      num = (int('{0:b}'.format(bits),2) + 33) % 127
      passwrd+= chr(num)

然后你可以检查你的条件是否满足。

【讨论】:

  • 你不应该使用random 模块,它的伪随机性很适合测试,但对于这个目的来说非常弱。改用内置的secrets 模块
【解决方案3】:

我对 python 和 * 比较陌生,但这是我对你的问题的看法:

import string
import random


def password_generator(length):
    """ Function that generates a password given a length """

    uppercase_loc = random.randint(1,4)  # random location of lowercase
    symbol_loc = random.randint(5, 6)  # random location of symbols
    lowercase_loc = random.randint(7,12)  # random location of uppercase

    password = ''  # empty string for password

    pool = string.ascii_letters + string.punctuation  # the selection of characters used

    for i in range(length):

        if i == uppercase_loc:   # this is to ensure there is at least one uppercase
            password += random.choice(string.ascii_uppercase)

        elif i == lowercase_loc:  # this is to ensure there is at least one uppercase
            password += random.choice(string.ascii_lowercase)

        elif i == symbol_loc:  # this is to ensure there is at least one symbol
            password += random.choice(string.punctuation)

        else:  # adds a random character from pool
            password += random.choice(pool)

    return password  # returns the string

print(password_generator(12))

我导入了两个模块,一个是“字符串”,它让我可以访问包含我需要的所有字符的字符串。另一个是“随机”,它允许我生成随机数并从字符串中选择一个随机字符。

使用 random.randint(a, b) 我可以为大写、小写和标点字符生成随机位置,以确保每个位置至少有一个。

我所做的唯一修改是我做了它,只要你在函数中输入所说的长度,你就可以生成任意长度的密码。

这是一个输出示例: L"mJ{~xcL[%M

【讨论】:

  • 你不应该使用random 模块,它的伪随机性很适合测试,但对于这个目的来说非常弱。改用内置的secrets 模块
【解决方案4】:

下面的代码完全符合我的要求,但我将@OliverF 代码标记为该问题的解决方案,因为他的代码也可以正常工作并在我自己的答案之前发布。

#!/usr/bin/env python3
#import the necessary modules!
import random
import string

length = random.randint(12,25)
lower = string.ascii_lowercase
upper = string.ascii_uppercase
num = string.digits
symbols = string.punctuation
    
all = lower + upper + num + symbols

temp = random.sample(all,length)

password = "".join(temp)

print(password)

【讨论】:

  • 你不应该使用random 模块,它的伪随机性很适合测试,但对于这个目的来说非常弱。改用内置的secrets 模块