使用python生成包含小写和大写以及数字的8个字符的密码

时间:2016-07-06 12:32:35

标签: python password-generator

我希望使用python生成密码,包括小写和大写以及数字,但是应该保证所有这3种都已被使用。到目前为止我写了这个,但它不保证所有3种字符都被使用。我希望将8个字符分成2个部分。前3和后5。然后确保在第一部分中使用所有3种字符然后用下一部分将它们洗牌,但我不知道如何编码。

import random
a = 0
password = ''
while a < 8:
    if random.randint(0, 61) < 10:
        password += chr(random.randint(48, 57))
    elif 10<random.randint(0, 61)<36:
        password += chr(random.randint(65, 90))
    else:
        password += chr(random.randint(97, 122))
    a += 1
print(password)

3 个答案:

答案 0 :(得分:3)

正如你所说:前三个位置分别是从大写和小写字符和数字中随机选择的,其余的是从所有字符中随机选择,然后随机播放。

from random import choice, shuffle
from string import ascii_uppercase, ascii_lowercase, digits
pwd = [choice(ascii_lowercase), choice(ascii_uppercase), choice(digits)] \
      + [choice(ascii_lowercase + ascii_uppercase + digits) for _ in range(5)]
shuffle(pwd)
pwd = ''.join(pwd)

请注意,这种数字可能有点“代表性不足”,因为它们是从所有可用字符的大部分中随机选择的,因此有可能10/62,前三个字符后的任何字符都是数字。如果你想要1/3的字符是数字(这可能不是一个好主意 - 见下文),你可以先随机选择一个字符组,每个字符组有1/3的几率,然后是一个字符组形式:< / p>

pwd = [choice(ascii_lowercase), choice(ascii_uppercase), choice(digits)] \
      + [choice(choice([ascii_lowercase, ascii_uppercase, digits])) for _ in range(5)]

但请注意,这将减少随机性,从而降低密码的安全性 - 但是要求至少拥有三个组中的一个。

答案 1 :(得分:0)

您的问题由3部分组成:

  1. 将8个字符分成2个部分 - 前3个和后5个 - (字符串切片)
  2. 确保在第一部分中使用了所有3种字符(验证密码)
  3. 洗牌(洗牌)
  4. 第1部分:切片字符串

    这是一个很好的教程,教授如何slice strings using python ..

    在您的情况下,如果您在代码的末尾插入此内容...

    print(password[:3])
    print(password[3:])
    

    ...你会看到前3个字符和最后5个字符。

    第2部分:验证密码

    可以找到一个好的答案here

    def password_check(password):
        # calculating the length
        length_error = len(password) < 8
    
        # searching for digits
        digit_error = re.search(r"\d", password) is None
    
        # searching for uppercase
        uppercase_error = re.search(r"[A-Z]", password) is None
    
        # searching for lowercase
        lowercase_error = re.search(r"[a-z]", password) is None
    
         # overall result
        password_ok = not ( length_error or digit_error or uppercase_error or lowercase_error)
    
        return password_ok
    
    password_check(password) 
    

    如果满足所有条件,此函数将返回True,如果不满足,则返回False

    第3部分:改组字符串

    if password_check(password) == True:
        new_pwd = ''.join(random.sample(password,len(password)))
        print new_pwd
    

    此代码将随机播放整个密码,并将其分配给名为new_pwd

    的新变量

    PS。 整个代码可以找到here

答案 2 :(得分:0)

您可以使用正则表达式并检查是否有任何字符与正则表达式匹配。

import re
string = "AaBbCc12"

if re.search('[a-z]',string)\
and re.search('[0-9]',string)\ 
and re.search('[A-Z]',string):
    print("This is a string you are looking for")
else:
    print("Nope")

这是一个相当不优雅的解决方案,但在理解和适应性方面是最快的。